文档章节

Spring_总结_04_高级配置(三)_处理歧义

o
 osc_pn11u1x9
发布于 2018/08/06 23:06
字数 799
阅读 0
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

一、前言

本文承接上一节:Spring_总结_04_高级配置(二)之条件注解@Conditional

我们前面装配bean时,在Spring容器中,都是只有一个bean能匹配所需的结果。

如果有多个bean能匹配结果的话,Spring就将无法做出选择,这就是自动装配的歧义性。

这一节我们将解决自动装配的歧义性

 

二、歧义实例

1.实体类

如下,有三个类都继承自Dessert

@Component
public class Cake implements Dessert {...}

@Component
public class Cookies implements Dessert {...}

@Component
public class IceCream implements Dessert {...}

 

2.注入bean

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

 

3.异常

Spring有选择困难症,当Spring尝试自动装配 setDessert() 中的 Dessert 参数时,发现有三个选择,这时它会抛出一个NoUniqueBeanDefinitionException异常,来表示自己无从选择。

 

 

 

 

 

可用 @Primary 和 @Qualifier 来解决歧义问题。

三、@Primary

 在声明Bean的时候,通过将其中一个可选的bean设置为首选(primary)Bean,能够避免自动装配的歧义性。

被@Primary注解的bean即可首选Bean。

1.配置首选Bean

配置首选Bean有如下两种方式:

(1)在组件类中配合@Component使用

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

 

(2)在配置类中配合@Bean使用

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

 

2.注入bean

注入bean时,Spring会找到三个可选bean,其中一个是首选bean,因此会选择首选bean进行注入。

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

 

 

注意:Spring 有选择困难症,若配置了两个及以上的首选Bean,则Spring有无从选择了。

 

四、@Qualifier

Spring 的限定符能够将bean限定到唯一一个满足要求的bean.

1. 基于ID的限定符

 为@Qualifier注解所设置的参数就是想要注入的bean的 ID

@Autowired
@Qualifier("iceCream")      //在注入的时候,指定注入的bean为 iceCream
public void setDessert(Dessert dessert){
    this.dessert = dessert;
}

 

 

2. 面向特性的限定符

我们可以为bean设置自己的限定符,而不是依赖于将 bean ID 作为限定符。

可在声明Bean或配置Bean时,使用@Qualifier注解设置限定符。

2.1 设置限定符

(1)在声明Bean时,设置限定符

@Component
@Qualifier("cold")     //设置限定符为 cold
public class IceCream implements Dessert {...}

 

(2)在配置Bean时,设置限定符

@Bean
@Qualifier("cold")     //设置限定符为 cold
public Dessert iceCream(){ 
     return new IceCream(); 
}

 

2.2 使用限定符

@Autowired
@Qualifier("cold")   //注入限定符为 cold 的bean
public void setDessert(Dessert dessert){
    this.dessert = dessert;
}

 

 

3 自定义限定符注解

有时,我们想为bean设置多个限定符,如下:

@Component
@Qualifier("cold")       //设置限定符为 cold
@Qualifier("creamy")     //设置限定符为 creamy
public class Popsicle implements Dessert {...}

然而,Java不允许在同一个条目上重复出现相同类型的多个注解

 

为了解决这个问题,我们可以创建自定义的限定符注解。

(1)自定限定符注解

@Cold

@Target({
        ElementType.TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.FIELD,
        ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold{ }

@Creamy

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

 

(2)为bean设置多个限定符

@Component
@Cold
@Creamy 
public class IceCream implements Dessert {...}

 

(3)注入bean时,使用多个限定符来限定

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

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

如何在Pandas的DataFrame中的行上进行迭代? - How to iterate over rows in a DataFrame in Pandas?

问题: I have a DataFrame from pandas: 我有一个来自熊猫的DataFrame : import pandas as pdinp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]df = pd.DataFrame(......

富含淀粉
10分钟前
12
0
与电商节伴生,平台销量榜单背后还有被低估的营销价值

文 | 曾响铃 来源 | 科技向令说(xiangling0815) 时至今日,电商节已经成为各巨头零售平台例行的活动,花样在不断创新,玩法也在不断涌现。 在这个过程中,伴随电商节的各种品牌、产品销量榜...

曾响铃
12分钟前
14
0
volatile关键字详解

前言 提到JAVA的并发编程,就不得不提volatile关键字,不管是在面试还是实际开发中,volatile关键字的使用都是一个应该掌握的技能。它之所以重要,是因为它和JAVA并发编程中会遇到三种重要问...

ls_cherish
38分钟前
10
0
比继承更偏爱组成? - Prefer composition over inheritance?

问题: Why prefer composition over inheritance? 为什么更喜欢使用组合而不是继承? What trade-offs are there for each approach? 每种方法都有哪些取舍? When should you choose inher...

javail
41分钟前
17
0
2020软件测试工程师史上最全面试题(内含答案)-看完BATJ面试官对你竖起大拇指!

以下是软件测试相关的面试题及答案,欢迎大家参考! 我不是至尊宝,也不是孙悟空,我只是那城墙下的一猿。  1、你的测试职业发展是什么?  测试经验越多,测试能力越高。所以我的职业发展是需...

程序员一凡
45分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部