Весна не создает фасоль

У меня есть два 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 03.10.2018 15:24

У вас есть исключение?

user10367961 03.10.2018 15:24

@ M.Deinum У меня есть точка останова в обоих методах. И я получаю исключение при создании другого bean-компонента, который использует bean-компонент, который не был создан.

Kamil Ruszczyk 03.10.2018 15:27

@Qualifier на другом конце, где будет использоваться этот bean-компонент?

Andrew S 03.10.2018 15:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
775
3

Ответы 3

Попробуйте вместо этого использовать имена 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-компонента, которое мы хотим. Надеюсь, это поможет.

Другие вопросы по теме