前言
自动装配让Spring完全负责将bean引用注入到构造参数和属性中,它能够减少装配应用程序组件时所需要的显示配置的数量。但是,仅有一个bean匹配所需的结果时,自动装配才是有效的,如果不仅有一个bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性、构造器参数或方法参数。
处理自动化装配的歧义性
1.就前言中提到的歧义性,Spring提供了多种可选方案来解决这样的问题。可以将bean中的某一个设为首选(primary)的bean,或者使用限定符(qualifier)来帮助Spring将可选的bean的范围缩小到只有一个bean。
标示首选的bean
在Spring中,可以通过@Primary来表达最喜欢的方案。@Primary能够与@Component组合在组件扫描的bean上,也可以与@Bean组合在Java配置的bean的声明中。
Java隐式配置:
@Component
@Primary
public class IceCream implements Dessert{...}
Java配置显示声明:
@Bean
@Primary
public Dessert iceCream(){
return new IceCream();
}
XML配置bean:
<bean id="iceCream" class="com.desserteater.IceCream" primary="true"/>
注:当首选(primary)标示了不止一个的时候,这时候仍然会出现自动装配的歧义性。
限定自动装配的bean
由于首选(primary)方案无法使得bean的选择缩小至一个,因此对于Spring的限定符而言,它是能够在所有可选的方案上进行缩小范围的操作,最终能够达到只有一个bean满足所规定的限制条件。如果将所有的限定符都用上后依然存在歧义性,那么你可以继续使用更多的限定符来缩小选择范围。
@Qualifier注解是使用限定符的主要方式。它可以与@Autowired和@Inject协同使用,在注入的时候指定想要注入进去的是哪个bean。
@Autowired
@Qualifier("iceCream")
public void setDessert(Dessert dessert){
this.dessert = dessert;
}
上面是使用限定符的最简单的例子,为@Qualifier注解所设置的参数就是想要注入的bean的ID。当然我们也可以为bean设置自己的限定符,而不是依赖将beanID作为限定符。
我们所需要的是创建一个注解,它本身使用@Qualifier注解来标示。这样我们将不再使用@Qualifier(“cold”),而是使用自定义注解的@Cold注解:
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,
ElementType.Method,ElementType.TYPE})
@Retention(RententionPolicy.RUNTIME)
@Qualifier
public @interface Cold{}
@Component
@Cold
public class Popsicle implements Dessert{...}