Spring高级装配之处理自动化装配的歧义性

前言

自动装配让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{...}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值