Spring 春天当有多个bean具有相同的限定符时,bean注入是如何工作的?

Spring 春天当有多个bean具有相同的限定符时,bean注入是如何工作的?,spring,dependency-injection,Spring,Dependency Injection,假设您有以下扩展处理器接口的类: Interface Processor {} class ProcesorImpl1 implements Processor {} class ProcesorImpl2 implements Processor {} 现在,假设您在package1的配置类中定义了以下bean: class ConfigurationClass1 { @Bean @Qualifier("processor") public 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注释了呢?

限定符
不适用于
@Bean
注释,但是
@Primary
可以,并且它将定义如果您按类型注入一个Bean,并且Spring管理多个此类Bean,那么将注入什么具体Bean。如果要注入另一个非主bean,可以使用
@Qualifier(“beanName”)
注释标记它,以按名称注入它。 如果您定义两个具有相同名称和相同类型的bean,如下所示

class ConfigurationClass1 {

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

}

class ConfigurationClass2 {

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

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