简体   繁体   English

春天不创造豆

[英]spring not creating bean

I have two beans that implements the same interface.我有两个实现相同接口的 bean。 Both are created in Java configuration, like this:两者都是在 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);
}

The problem is that spring doesn't create first bean only the second.问题是 spring 不会只创建第二个 bean。 Any idea why?知道为什么吗?

Try using bean names instead:尝试使用 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);
}

Ok, the problem was with method name, after changing it, bean is properly created.好的,问题出在方法名称上,更改后,bean 已正确创建。 In some other library configuration class was a method with same name.在其他一些库配置类中有一个同名的方法。 Guessing that was the problem.猜测这是问题所在。

@Qualifier annotation is used to select one bean over multiple available beans of same type in spring container. @Qualifier 注解用于在 spring 容器中多个相同类型的可用 bean 中选择一个 bean。

when you annotate a method with @Bean annotation, default, it creates a bean whose name is the name of same method.当您使用@Bean 注解注解一个方法时,默认情况下,它会创建一个名称为相同方法名称的 bean。 So, for example:因此,例如:

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

first method will create an instance of BeanA with name 'itsBeanA'.第一个方法将创建一个名为“itsBeanA”的 BeanA 实例。 Second, will create an instance with name 'specialBeanA' since we provided the name attribute here.其次,将创建一个名为“specialBeanA”的实例,因为我们在此处提供了 name 属性。 There maybe a scenario where you need to have multiple beans of same TYPE (like BeanA here).可能有一个场景,你需要有多个相同类型的 bean(比如这里的 BeanA)。 It will create ambiguity for container which bean to use of all same types, we specify the @Qualifier with the name of bean which we want.它将为容器使用所有相同类型的 bean 创建歧义,我们使用我们想要的 bean 名称指定 @Qualifier。 I hope that helps.我希望这有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM