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") ...
随机推荐
- 简单的linux压力测试工具webbench
wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar.gz cd we ...
- CSS Box Model(盒子模型)
CSS Box Model(盒子模型) 一.简介 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封 ...
- Python数据可视化:网易云音乐歌单
通过Python对网易云音乐华语歌单数据的获取,对华语歌单数据进行可视化分析. 可视化库不采用pyecharts,来点新东西. 使用matplotlib可视化库,利用这个底层库来进行可视化展示. 推荐 ...
- ubuntu 12.04网络设置
1.服务器版本 设置IP地址 ubuntu 12.04的网络设置文件是/etc/network/interfaces,打开文件,会看到 auto lo iface lo inet loopback 这 ...
- linux下如何制作ext4文件系统镜像
1.生成一个空的2MiB文件 dd if=/dev/zero of=rootfs.ext4 bs=1024 count=2048 (指定每一块大小为1024字节,一共又2048块,那么就是2048 * ...
- swift学习笔记 - swift3.0用GCD实现计时器
swift3.0之后,GCD的语法发生了翻天覆地的变化,从过去的c语法变成了点语法,下面是变化之后用GCD实现计时器的方法: 先贴代码: // 定义需要计时的时间 var timeCount = 60 ...
- Python学习札记(十九) 高级特性5 迭代器
参考:迭代器 Note 1.可用于for循环的对象有两类:(1)集合数据类型:list tuple dict str set (2)Generator:生成器和含yield语句的函数.这些可以直接作用 ...
- spring boot2.1读取 apollo 配置中心3
上篇记录了springboot读取apollo的配置信息,以及如何获取服务端的推送更新配置. 接下来记录一下,如何获取公共namespace的配置. 上文中使用如下代码共聚公共命名空间的配置: @Ap ...
- js 冒泡型事件
- Memcached flush_all 命令
Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对. 该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作. 语法 ...