春天没有创造豆

时间:2018-10-03 13:22:46

标签: java spring javabeans

我有两个实现相同接口的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);
}

问题在于spring不会仅创建第二个bean。知道为什么吗?

3 个答案:

答案 0 :(得分:0)

尝试改用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);
}

答案 1 :(得分:0)

好吧,问题出在方法名称上,更改后,就正确创建了bean。在其他一些库配置类中,是一个具有相同名称的方法。猜测是问题所在。

答案 2 :(得分:0)

@Qualifier注释用于在spring容器中的多个可用的相同类型的bean中选择一个bean。

在使用@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);
    }

第一个方法将创建名称为“ itsBeanA”的BeanA实例。其次,由于我们在此处提供了name属性,因此将创建一个名称为'specialBeanA'的实例。 在某些情况下,可能需要多个具有相同类型的Bean(例如此处的BeanA)。它将为要使用所有相同类型的bean的容器创建歧义,我们使用所需的bean名称指定@Qualifier。 希望对您有所帮助。