SpringInAction--Bean自动装配的歧义性处理
在前面,学习如何装配Bean的时候,或许会发现,有的同类型的Bean智能配置一个
如下:
package com.bean.java; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* Created by IntelliJ IDEA.
* Author XueYuan
* Data 2017/02/22
* Time 10:08
*/ @Configuration
public class CDPlayerConfig { /**
* @Bean 可以不指定名字 默认为方法名——'dangNianQing'
* @Bean(name="XXX") 也可以指定一个名字
*/ /*@Bean
public CompactDisc dangNianQing() {
return new DangNianQing();
}*/
@Bean
public CompactDisc randomCd() {
int choice = (int) Math.floor(Math.random() * 4);
switch (choice) {
case 0:
return new RandomCd("dangNianQing");
case 1:
return new RandomCd("qianNvYouHun");
case 2:
return new RandomCd("wo");
default:
return new RandomCd("chenMoShiJing");
}
} /*@Bean
public CDPlay cdPlay(){
return new CDPlay(dangNianQing());
}*/ @Bean
public CDPlay cdPlay(CompactDisc compactDisc){
return new CDPlay(compactDisc);
} /* @Bean
public CDPlay cdPlay(CompactDisc compactDisc){
return new CDPlay(compactDisc);
}*/ }
dangNianQing() 与 randomCd() 他们的类型都是 CompactDisc 在 cdPlay() 装配的时候,如果我们没有注释掉其中一个,那么就会报错
因为他不知道我么想要的是哪个,所以只能罢工——NoUniqueBeanDefinitionException异常
那么我们如果不想注释也是可以的,但是我么得告诉它,当发生冲突的时候,我们应该优先选择哪个,这个时候需要我么的 Primary出场了
在java配置中的格式如下:
@Bean
@Primary
public CompactDisc dangNianQing() {
return new DangNianQing();
}
当然 @Bean变成@Component也是一样的
下面就是xml中的配置,在<bean> 中有一个primary的属性来表示为首选的bean
<bean primary="true" id="flyingMounts" class="com.bean.profile.FlyingMounts"/>
我们可以用primary 来解决几个Bean中我们应该首选哪个的问题,但是假如又有一些变态的要求,要我们在首选的中选一个首选的。。
这样以来,首选的primay使用就没有意义了,因为它回到原点了,不知道哪个是首选了。这个时候,我们的Qualifier就可以华丽丽的出场了(等等等等~ )
@Qualifier 注解是使用限定符的主要方式,它可以与@Autowired和@Inject协同使用,在注入的时候我们可以制定注入哪个bean
@Autowired
@Qualifier("cdPlay1")
CDPlay cdPlay;
表示我要注入名字为cdPlay1的Bean
如下所示,应该是cdPlay1()的方法,bean会自动命名一个id的,以前我们已经学过了
@Bean
//@Qualifier("dangNianQing")
public CDPlay cdPlay1(CompactDisc compactDisc) {
return new CDPlay(compactDisc);
} @Bean
public CDPlay cdPlay(CompactDisc compactDisc){
return new CDPlay(compactDisc);
}
但是假设,我们这个Bean需要被不止一个人使用,假如 cdPaly()和cdPlay1() ,都被需求,那么按照上面的Qualifier应该是这样配置的
@Autowired
@Qualifier("cdPlay1")
@Qualifier("cdPlay")
CDPlay cdPlay;
但是java不允许在同一个目录上面重复相同类型的多个注解,这个时候怎么办呢?
莫慌,我们可以自定义
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface cdPlay1 {
}
这样一来我们可以直接用@cdplay1就可以了,多个的话我们就多创建几个,然后加上去就OK了
上面就说bean歧义性解决的方法,如果错误,欢迎指出,谢谢~
SpringInAction--Bean自动装配的歧义性处理的更多相关文章
- Spring实战之处理自动装配的歧义性
仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性.构造器参数或方法参数.为了阐述自动装配的歧义性,假设我们使用@A ...
- Spring入门(八):自动装配的歧义性
1. 什么是自动装配的歧义性? 在Spring中,装配bean有以下3种方式: 自动装配 Java配置 xml配置 在这3种方式中,自动装配为我们带来了很大的便利,大大的降低了我们需要手动装配bean ...
- spring装配---处理自动装配的歧义性
一.歧义性 当我们使用spring的注解进行自动装配bean时,如果不仅有一个bean能够匹配结果的话,会抛出NoUniqueBeanDefinitionException: 例如本例中 当sprin ...
- spring学习总结——高级装配学习二(处理自动装配的歧义性)
我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...
- Spring-处理自动装配的歧义性
自动装配可以对依赖注入提供很大帮助,因为它会减少装配应用程序组件时所需的显式装配的数量. 不过,仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配的话,这种歧义性会阻 ...
- Spring实战(六)自动装配的歧义性
1.Spring进行自动装配时碰到的bean歧义性问题. 在进行自动装配时,只有仅有一个bean匹配所需结果时,才是可行的. 如果不仅仅一个bean能够匹配结果,例如一个接口有多个实现,这种歧义性会阻 ...
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除BEAN自动装配的歧义@QUALIFIER及自定义注解
一. The @Qualifier annotation is the main way to work with qualifiers. It can beapplied alongside @Au ...
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除bean自动装配的歧义@Primary
一. 假设有如下三个类实现同一个接口,则自动装配时会产生歧义 @Component public class Cake implements Dessert { ... } @Component pu ...
- Spring处理自动装配的歧义性
1.标识首选的bean 2.使用限定符@Qualifier 首先在bean的声明上添加@Qualifier 注解: @Component @Qualifier("cdtest") ...
随机推荐
- python 切换工作路径 为指定文件夹
切换工作路径为了更好的在目录下面执行针对当前项目的命令 比如 git.svn .打包 等操作 关键命令: os.chdir() 切换到指定路径: # sys.path[0] 当前脚本路径 # 当前脚本 ...
- centos安装oracle客户端
使用centos远程登陆oracle服务器: 下载需要的rpm包: [root@node1 oracle]# lltotal 59872-rw-r--r-- 1 root root 59865008 ...
- 第三周JAVA程序设计基础学习总结
20145322学号 <Java程序设计>第3周学习总结 ## 教材学习内容总结 之前第三章说过Java中主要有基本类型和类类型两种类型系统,第四章主要谈类类型. 类定义时使用class关 ...
- 都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行用法
前几天在嵌入式linux上用到alsa command,网上查的资料多不给力,只有动手一点点查,终于可以用了,将这个使用方法告诉大家,以免大家少走弯路. 0.先查看系统支持哪几个alsa cmd: l ...
- Fiddler4工具配置及调试手机和PC端浏览器
Fiddler最大的用处: 模拟请求.修改请求.手机应用调试 Fiddler最新版本 下载地址: http://www.telerik.com/download/fiddler Fiddler 想要监 ...
- [JavaScript]YYYY-MM-DD格式字符串计算年龄
function getAge(birth){ birth = birth.replace(/-/g,"/"); //把格式中的"-"替换为"/&qu ...
- 重新想,重新看——CSS3变形,过渡与动画③
这一篇主要谈谈CSS3的过渡属性. 过渡属性被设计的十分通俗易懂,属性写法为transition,有四个子属性: <transition-property> 表示需要过渡的属性[必须](本 ...
- Spring Boot CRUD+分页(基于JPA规范)
步骤一:JPA概念 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活的可能是Hibernate,TopLink等等实现了JPA ...
- 解题报告:hdu1284 钱币兑换问题
2017-09-03 19:03:06 writer:pprp 状态定义: dp[i][j] = x 代表的是 用前i 中硬币构造 j 美分的方法数目: 初始化: dp[0][0] = 1 状态转移: ...
- UVa 10883 超级平均数(二项式系数+对数计算)
https://vjudge.net/problem/UVA-10883 题意: 给出n个数,每相邻两个数求平均数,依次类推,最后得到1个数,求该数. 思路: 演算一下可以发现最后各个数的系数就是二项 ...