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

处理自动装配的歧义性

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

@Autowired
public void setDessert(Dessert dessert){
    this.dessert = dessert;
}

@COmponent
public class Cake implements Dessert{...};

@COmponent
public class Cookies implements Dessert{...};

@COmponent
public class IceCream implements Dessert{...};

这时Spring无法做出选择而抛出异常NoUniqueBeanDefinitionException

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

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

@Component
@Primary
public class IceCream implements DEssert{...}

或者当显示的配置IceCream时

@Bean
@Primary
public Dessert icecream(){
    return new IceCream();
}

或在xml中
<bean id="icecream" class="..."
    primary="true" />


限定自动装配的bean

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

@Autowired
@Qualifier("iceCream") // 括号内为bean的ID
public 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)
@Qualifier
public @interface Clod{};

@Target({ElementType.CONSTRUCTOR,Element.FILED,Element.METHOD,Element.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Creamy{};

@Component
@Code
@Creamy

public class IceCream implements Dessert{
    ...
}

@Autowired
@Cold
@Creamy
public Dessert iceCream(){
    return new IceCream();
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值