Spring_总结_04_高级配置(三)_处理歧义
一、前言
本文承接上一节: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;
}
Spring_总结_04_高级配置(三)_处理歧义的更多相关文章
- Spring_总结_04_高级配置(二)_条件注解@Conditional
一.前言 本文承接上一节:Spring_总结_04_高级配置(一)之Profile 在上一节,我们了解到 Profile 为不同环境下使用不同的配置提供了支持,那么Profile到底是如何实现的呢?其 ...
- Spring_总结_04_高级配置(五)_运行时注入值
一.前言 本文承接上一节:Spring_总结_04_高级配置(四)_bean的作用域 当讨论依赖注入的时候,我们通常所讨论的是将一个bean引用注入到另一个bean的属性或者构造参数中.它通常指的是将 ...
- Spring_总结_04_高级配置(四)_bean的作用域
一.前言 本文承接上一节:Spring_总结_04_高级配置(三)之处理歧义 1.单例bean Spring应用上下文中所有的bean默认都是单例的.也就是说,不管一个bean被注入到其他bean多少 ...
- Spring_总结_04_高级配置(六)_Bean的初始化和销毁
一.前言 本文承接上一节:Spring_总结_04_高级配置(五)_运行时注入值
- Spring_总结_04_高级配置(一)_Profile
一.前言 本文承接上一节:Spring_总结_03_装配Bean(四)之导入与混合配置 这一节,来总结一下profile. 我们在开发软件时,通常会进行跨环境部署.而在跨环境部署时,经常会遇到某些环境 ...
- Spring_总结_03_装配Bean(四)_导入与混合配置
一.前言 本文承接上一节:Spring_总结_03_装配Bean(三)之XML配置 在典型的Spring应用中,我们可能会同时使用自动化和显示配置.同时,可能在某些场景下我们需要混合使用JavaCon ...
- [转]JEXUS的高级配置
转自:http://www.cnblogs.com/xiaodiejinghong/archive/2013/04/14/3019660.html 前一回合,我们对服务器软件Jexus作了简单的介绍, ...
- Cisco ASA 高级配置
Cisco ASA 高级配置 一.防范IP分片攻击 1.Ip分片的原理: 2.Ip分片的安全问题: 3.防范Ip分片. 这三个问题在之前已经详细介绍过了,在此就不多介绍了.详细介绍请查看上一篇文章:I ...
- Stm32高级定时器(三)
Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...
随机推荐
- leetcode第一刷_Rotate Image
这个题该怎么说呢.旋转又要求inplace.一般就是要找到某种规律了.这个还是非常明显的,画一下原来的.再画一下旋转之后的.看看原来的跑到什么位置了. 牵扯到四个位置按顺时针方向互换一下位置,发现仅仅 ...
- numpy的通用函数:快速的元素级数组函数
通用函数(ufunc)是对ndarray中的数据执行元素级运算的函数.可看作简单函数的矢量化包装. 一元ufunc sqrt对数组中的所有元素开平方 exp对数组中的所有元素求指数 In [93]: ...
- 爬虫五 Beautifulsoup模块详细
一.基本使用 from bs4 import BeautifulSoup htmlCharset = "GB2312" soup=BeautifulSoup(html_doc,'l ...
- 第二篇 Python图片处理模块PIL(pillow)
本篇包含:16.Point 17.Putalpha 18.Putdata 19.Putpalette 20.Putpixel 21.Quantize 22.R ...
- java多线程笔记
一,线程的状态 1,新建状态:新创建了一个线程对象 2,就绪状态:线程创建对象后,线程调用star()的方法,等待获取CPU的使用权. 3,运行状态:获取了cpu的使用权,执行程序代码 4,阻塞状态: ...
- Js 类型方面的神坑
你有没有遇见过本来好好的一个数组结果 typeof 出来是个 object 的情况,你有没有遇到过非要写个 typeof x === "undefined" 判断未赋值的情况... ...
- cocos2dx打飞机项目笔记七:各种回调:定时器schedule、普通回调callFunc、菜单回调menu_selector、事件回调event_selector
各种回调函数的定义: typedef void (CCObject::*SEL_SCHEDULE)(float); typedef void (CCObject::*SEL_CallFunc)(); ...
- INSPIRED启示录 读书笔记 - 第13章 产品原则
确定什么最重要 产品原则是对团队信仰和价值观的总结,用来指导产品团队作出正确的决策和取舍.它体现了产品团队的目标和愿景,是产品战略的重要组成部分.从形式上看,它是一系列明确的.体现团队特色的产品价值准 ...
- 输入框去除默认的文字,jquery方法
需求:所有的输入框获取焦点时,去掉默认的提示文字,失去焦点时如果输入框为空,恢复默认的提示文字. 解决方案:jquery方法,以下有三种,按照利弊,我建议最后一种. 先看html代码: <inp ...
- tomcat 日志禁用
1.禁用catalina.out日志通过修改catalina.sh配置可以控制tomcat不生成该文件只要将if [ -z "$CATALINA_OUT" ] ; then CAT ...