处理Spring使用@Autowired自动装配的歧义性

@Autowired默认使用的是byType的方式注入,@Qualifier则是使用byName的方式
阐述自动装配的歧义性,假设使用@Autowired注解标注了setDessert()方法:
@Autowired
public void setDessert(Dessert dessert){
    this.dessert=dessert;
}
    在本例中,Dessert是一个接口,并且有了三个类实现了这个接口,分别为Cake、Cookies和IceCream:
@Component
public class Cake implements Dessert{...}
@Component
public class Cookies implements Dessert{...}
@Component
public class IceCream implements Dessert{...}
因为这三个实现都使用了@Component注解,在组件扫描的时候,能够发现它们并将其创建为Spring应用上下文里面的bean。然后当Spring试图自动装配setDessert()中的Dessert参数时,它并没有唯一、无歧义的可选值。此时Spring会抛出NoUniqueBeanDefinitionException;
当发生歧义性时,Spring提供了多种可选方案来解决这样的问题:


1.标示首选的bean
在声明bean的时候,通过将其中一个可选的bean设置为首选(primary)bean能够避免自动装配时的歧义性。例:
@Component
@Primary
public class IceCream implements Dessert{...}
或者通过Java配置显示声明IceCream,那么@Bean方法应该如下所示:
@Bean
@Primary
public Dessert iceCream(){
    return new IceCream();
   }
如果使用XML配置bean的话,也可以实现这样的功能。<bean>元素有一个primary属性用来指定首选的bean:
<bean id="iceCream" class="com.desserteater.IceCream" primary="true" />
无论采用哪种方式来表示首选bean效果都是一样的。但是如果标示了两个或更多的首选bean,那么它就无法正常工作了
2.限定自动装配的bean
@Qualifier注解是使用限定符的主要方式。它可以与@Autowired和@Inject协同使用,在注入的时候指定想要注入进去的是哪个bean。例如,我们想要确保将IceCream注入到setDessert()之中:
@Autowired
@Qualifier("iceCream")
public void setDessert(Dessert dessert){
    this.dessert=dessert;
}
创建自定义的限定符
       我们可以为bean设置自己的限定符,而不是依赖于将beanID作为限定符。在这里需要做的就是在bean的声明上添加@Qualifier注解。例如,它可以与@Component组合使用,如下所示:
@Component
@Qualifier("cold")
public class IceCream implements Dessert{...}
此时cold限定符分配给了IceCream bean。当自动装配时想要注入IceCream时,引用cold限定符就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值