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") ...
随机推荐
- 单元测试工具Nunit
原文链接:http://blog.csdn.net/snowshinoy/article/details/6951352 调试 附加到: nunit-agent.exe进程:
- JAVA学习笔记之JAVA 对象引用以及赋值
关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没 ...
- Python3.x:代理ip刷评分
Python3.x:代理ip刷评分 声明:仅供为学习材料,不允许用作商业用途: 一,功能: 针对某网站对企业自动刷评分: 网站:https://best.zhaopin.com/ 二,步骤: 1,获取 ...
- QT控件学习
一.QPushButton 1.设置背景色: ui->pushButton->setStyleSheet("background-color: rgb(170, 0, 255)& ...
- 在Windows下安装运行Kafka
一.安装JAVA JDK 1.下载安装包 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. ...
- vscode调试pomelo和pomelo使用vscode调试
使用vscode 通过端口remote attach进行调试 pomelo. 0. 网上好多调试pomelo的都是webstorm.或者vscode调试node的教程.但没找到vscode调试pome ...
- Django安装及创建工程
Django MTV模型介绍 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻 ...
- 使用vs的时候,遇到这个:当前不会命中断点 还没有为该文档加载任何符号
一 http://stackoverflow.com/questions/2155930/fixing-the-breakpoint-will-not-currently-be-hit-no-symb ...
- Union 和Union all的区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: 例如: select employee_id,jo ...
- Win10m的前景到底在何方?
今天晚上就是build2016的微软开发者大会了,满怀着期待. 本人一直是一名微软的粉丝,我年纪小,刚开始接触电脑的时候是win98,那时候也没怎么玩过电脑,到后来经常接触电脑的时候,所有的电脑都是w ...