весна не создает боб - PullRequest
       7

весна не создает боб

0 голосов
/ 03 октября 2018

У меня есть два компонента, которые реализуют один и тот же интерфейс.И то, и другое создается в конфигурации 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);
}

Проблема в том, что spring не создает первый bean-компонент, а только второй.Есть идеи почему?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Хорошо, проблема была с именем метода, после его изменения бин был создан правильно.В какой-то другой библиотеке конфигурации класса был метод с тем же именем.Угадай, в чем проблема.

0 голосов
/ 03 октября 2018

@ Квалификационная аннотация используется для выбора одного компонента из нескольких доступных компонентов одного типа в контейнере пружины.

, когда вы аннотируете метод с помощью аннотации @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.Там может быть сценарий, где вам нужно иметь несколько бинов одного и того же ТИПА (например, BeanA здесь).Это создаст неоднозначность для контейнера, боб которого будет использовать все те же типы, мы указываем @Qualifier с именем бина, который мы хотим.Я надеюсь, что это помогает.

0 голосов
/ 03 октября 2018

Попробуйте вместо этого использовать имена бинов:

@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);
}
...