我有两个实现相同接口的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。知道为什么吗?
答案 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。 希望对您有所帮助。