Оформить HelloWorldConfig
файл. Вы объявили 2 бина типа SpellChecker:
@Bean(name="a")
public SpellChecker spellChecker(){
return new SpellChecker();
}
@Bean(name="b")
public SpellChecker spellChecker1(){
return new SpellChecker();
}
Оба бина создаются весной, хотя в TextEditor
.
* 1007 добавляется только один боб. иметь более одного bean-компонента одного типа или bean-компонентов, которые реализуют один и тот же интерфейс (подумайте о слушателях - их может быть много) - поэтому контейнер Spring создаст их все во время запуска приложения.
Если вы хотите Однако, чтобы внедрить один из этих bean-компонентов в другой bean-компонент (например, TextEditor
в вашем случае), у Spring не будет подсказки, какой из них вводить, поэтому вы добавили функцию «определителя».
Еще одно замечание: вы по ошибке поместили аннотацию @Component
в класс конфигурации, вместо этого вы должны использовать аннотацию @Configuration
, чтобы указать, что этот класс содержит серию определений компонентов (которые вы действительно объявляете с помощью аннотации @Bean
) , Хотя «конфигурация» также является компонентом (управляемым Spring), Spring по-прежнему обрабатывает его значительно иначе, чем обычные bean-компоненты.
И еще одно замечание: хотя это не имеет прямого отношения к вашему вопросу, кажется, как будто вы смешиваете 2 стиля конфигураций в предоставленном вами фрагменте кода: стиль с @Qualifier/@Autowired
(этот способ был добавлен весной 2.5, если я не ошибаюсь) и стиль java конфигураций: @Configuration
класс с @Bean
-s в нем.
Вы можете полностью отказаться от использования autowire и внедрить зависимости через конструктор, вызываемый из java config следующим образом:
@Configuration
public class HelloWorldConfig {
@Bean
public HelloWorld helloWorld(){
return new HelloWorld();
}
@Bean
public TextEditor textEditor(@Qualifier("a") SpellChecker spellChecker){ // note the dependency here
return new TextEditor(spellChecker);
}
@Bean(name="a")
public SpellChecker spellChecker(){
return new SpellChecker();
}
@Bean(name="b")
public SpellChecker spellChecker1(){
return new SpellChecker();
}
}
// the TextEditor Class should have a constructor with one argument:
public class TextEditor {
private final SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
...
}
// or if you use lombok library:
@AllArgsConstructor
public class TextEditor {
private final SpellChecker spellChecker;
...
}
Теперь обратите внимание, что ваши "бизнес-классы" даже не знают о Spring, все "разрешение" (использование квалификаторов и правил внедрения) выполняется в конфигурации Spring, которая в любом случае является специальным классом.