SpringInAction 学习笔记:自动装配歧义性处理

来源:互联网 发布:蜗牛卡充值话费软件 编辑:程序博客网 时间:2024/06/05 02:35

处理自动装配的歧义性

仅有一个bean匹配所需结果时自动装配才是有效的

@Autowiredpublic void setDessert(Dessert dessert){    this.dessert = dessert;}@COmponentpublic class Cake implements Dessert{...};@COmponentpublic class Cookies implements Dessert{...};@COmponentpublic class IceCream implements Dessert{...};这时Spring无法做出选择而抛出异常NoUniqueBeanDefinitionException

spring提供了多种可选方案来解决这样的问题
- 将可选bean中的某一个设为首选的bean
- 使用限定符将spring可选范围缩小到只有一个bean

可以通过@Primary注解来表达最喜欢的方案

@Component@Primarypublic class IceCream implements DEssert{...}或者当显示的配置IceCream时@Bean@Primarypublic Dessert icecream(){    return new IceCream();}或在xml中<bean id="icecream" class="..."    primary="true" />

限定自动装配的bean

@Qualifier注解是使用限定符的主要方式,它可与@Autowired 和 @Inject 注解协同使用

@Autowired@Qualifier("iceCream") // 括号内为bean的IDpublic void setDessert(Dessert dessert){    this.dessert = dessert;}但此时限定符和bean的ID是紧耦合的
创建自定义限定符

需要做的就是在bean的声明上添加@Qualifier注解

@Component@Qualifier("cold")public class IceCream implements Dessert{    ...}然后在注入时@Autowired@Qualifier("cold")public Dessert iceCream(){    return new IceCream();}Java不允许同一条目上出现相同类型的多个注解,所以@Qualifier("") 不能写多个来缩小范围但还可以写 使用@Qualifier注解的自定义注解来缩小范围@Target({ElementType.CONSTRUCTOR,Element.FILED,Element.METHOD,Element.TYPE})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface Clod{};@Target({ElementType.CONSTRUCTOR,Element.FILED,Element.METHOD,Element.TYPE})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface Creamy{};@Component@Code@Creamypublic class IceCream implements Dessert{    ...}@Autowired@Cold@Creamypublic Dessert iceCream(){    return new IceCream();}
0 0
原创粉丝点击