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") ...
随机推荐
- Python3.x:zip()函数
Python3.x:zip()函数 1,概述: zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表: 2,示例: (1).示例1: x = [1, 2, 3] y = [4, ...
- .net 数据缓存(一)之介绍
现在的业务系统越来复杂,大型门户网站内容越来越多,数据库的数据量也越来愈大,所以有了“大数据”这一概念的出现.但是我们都知道当数据库的数据量和访问过于频繁都会影响系统整体性能体验,特别是并发量高的系统 ...
- eclipse集成tomcat修改字符集参数
问题: 在eclipse 4.4(Luna)中集成tomcat时,直接修改原tomcat目录中的配置文件,不起作用. 有时,我们会修改字符集参数为utf-8,以解决中文乱码问题,改动之后依然乱码…… ...
- [BZOJ2733]永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- SaltStack部署服务及配置管理apache+php-第二篇
实验目标 1.使用SaltStack部署apache和php, 2.使用salt管理httpd.conf配置文件配置访问info.php使用账户密码 3.在salt里面增加对conf.d目录进行配置管 ...
- Linux 网站文件和数据库全量备份 一键脚本(支持FTP,Google Drive)
原文连接: https://teddysun.com/469.html 此文为转载,建议查看秋水大神的原文,排版更容易查看,另外,建议查看脚本源码,方便了解脚本运行过程, 脚本已测试,大神的脚本一如既 ...
- validateJarFile jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
项目环境 Maven.Tomcat7.0.27.jdk1.8.0_111 报这个错误的原因是项目中依赖 javax.servlet-api 包和Tomcat本身的包冲突了,Tomcat本身也有这个包 ...
- [译]JavaScript需要类吗?
[译]JavaScript需要类吗? 原文:http://www.nczonline.net/blog/2012/10/16/does-javascript-need-classes/ 译者注:在 ...
- 解题报告:poj 3264 最基本的线段树
2017-10-07 17:54:55 writer:pprp /* @theme: 最基本的线段树 @writer:pprp @end:17:38 @attention:记录的数组应该从1开始,不能 ...
- Gym100783C Golf Bot(FFT)
https://vjudge.net/problem/Gym-100783C 题意: 给出n个数,然后有m次查询,每次输入一个数x,问x能否由n个数中2个及2个以下的数相加组成. 思路:题意很简单,但 ...