У меня есть два bean-компонента, которые реализуют один и тот же интерфейс. Оба созданы в конфигурации Java, например:
@Bean
@Qualifier("kafkaEventSender")
public IKafkaEventSender<KafkaData> kafkaEventSender(@Qualifier("EventBus") KafkaTemplate<String, Object> kafkaTemplate){
return new KafkaEventSender<>(kafkaTemplate, false);
}
@Bean
@Qualifier("kafkaEventSenderAudited")
public IKafkaEventSender<KafkaData> kafkaEventSenderAudited(@Qualifier("EventBus") KafkaTemplate<String, Object> kafkaTemplate){
return new KafkaEventSenderAudited<>(kafkaTemplate, false);
}
Проблема в том, что весна не создает первый компонент, а только второй. Есть идеи, почему?
У вас есть исключение?
@ M.Deinum У меня есть точка останова в обоих методах. И я получаю исключение при создании другого bean-компонента, который использует bean-компонент, который не был создан.
@Qualifier на другом конце, где будет использоваться этот bean-компонент?




Попробуйте вместо этого использовать имена bean-компонентов:
@Bean(name = "kafkaEventSender")
public IKafkaEventSender<KafkaData> kafkaEventSender(@Qualifier("EventBus") KafkaTemplate<String, Object> kafkaTemplate){
return new KafkaEventSender<>(kafkaTemplate, false);
}
@Bean(name = "kafkaEventSenderAudited")
public IKafkaEventSender<KafkaData> kafkaEventSenderAudited(@Qualifier("EventBus") KafkaTemplate<String, Object> kafkaTemplate){
return new KafkaEventSenderAudited<>(kafkaTemplate, false);
}
Хорошо, проблема была в имени метода, после его изменения bean-компонент создается правильно. В некоторой другой конфигурации библиотеки классом был метод с таким же именем. Догадываюсь, что это была проблема.
Аннотация @Qualifier используется для выбора одного компонента из нескольких доступных компонентов одного типа в контейнере Spring.
когда вы аннотируете метод аннотацией @Bean, по умолчанию он создает bean-компонент, имя которого является именем того же метода. Так, например:
@Bean
public BeanA itsBeanA() {
return new BeanA();
}
@Bean(name = "specialBeanA")
public BeanA itsAgainBeanA() {
return new BeanA("specialConstructorParam");
}
@Bean
public BeanB beanB(@Autowired @Qualifier("specialBeanA") BeanA beanA) {
return new BeanB(beanA);
}
Первый метод создаст экземпляр BeanA с именем itsBeanA. Во-вторых, мы создадим экземпляр с именем specialBeanA, поскольку мы предоставили здесь атрибут name. Может быть сценарий, в котором вам нужно иметь несколько bean-компонентов одного и того же ТИПА (например, BeanA здесь). Это создаст двусмысленность для контейнера, какой bean-компонент использовать всех одинаковых типов, мы указываем @Qualifier с именем bean-компонента, которое мы хотим. Надеюсь, это поможет.
Я сомневаюсь, что он создает только один, как вы это определяете?