弹簧。当有多个具有相同限定符的bean时,bean注入如何工作?

时间:2019-01-18 04:51:57

标签: spring dependency-injection

让我们假设您具有以下类来扩展Processor接口:

Interface Processor {}

class ProcesorImpl1 implements Processor {}

class ProcesorImpl2 implements Processor {}

现在,让我们假设您在package1的配置类中定义了以下bean:

class ConfigurationClass1 {

    @Bean
    @Qualifier("processor")
    public Processor processor() {
         return new ProcesorImpl1();
    }

}

接下来,您在package2的配置类中定义以下bean:

class ConfigurationClass2 {

    @Bean
    @Qualifier("processor")
    public Processor anotherProcessor() {
         return new ProcesorImpl2();
    }

}

问题是Spring如何解决以下注入:

@Inject @Qualifier("processor") proc;

如果其中一个Bean用@Primary注释怎么办?

1 个答案:

答案 0 :(得分:1)

Qualifier不能与@Bean批注一起使用,但是@Primary可以,并且它将定义如果您按类型注入一个bean并且有多个bean,则将注入什么具体bean。这种类型由Spring管理。如果要注入另一个非主bean,可以用@Qualifier("beanName")批注对其进行标记,以按名称注入它。 如果您定义2个具有相同名称和相同类型的bean

class ConfigurationClass1 {

    @Bean("processor")
    public Processor processor() {
         return new ProcesorImpl1();
    }

}

class ConfigurationClass2 {

    @Bean("processor")
    public Processor anotherProcessor() {
         return new ProcesorImpl2();
    }

}

由于默认情况下allowBeanDefinitionOverriding属性设置为true,因此Spring将在第二个中覆盖第一个已加载的bean,并且只有一个将保留在容器中。