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