在前面,学习如何装配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自动装配的歧义性处理的更多相关文章

  1. Spring实战之处理自动装配的歧义性

    仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性.构造器参数或方法参数.为了阐述自动装配的歧义性,假设我们使用@A ...

  2. Spring入门(八):自动装配的歧义性

    1. 什么是自动装配的歧义性? 在Spring中,装配bean有以下3种方式: 自动装配 Java配置 xml配置 在这3种方式中,自动装配为我们带来了很大的便利,大大的降低了我们需要手动装配bean ...

  3. spring装配---处理自动装配的歧义性

    一.歧义性 当我们使用spring的注解进行自动装配bean时,如果不仅有一个bean能够匹配结果的话,会抛出NoUniqueBeanDefinitionException: 例如本例中 当sprin ...

  4. spring学习总结——高级装配学习二(处理自动装配的歧义性)

    我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...

  5. Spring-处理自动装配的歧义性

    自动装配可以对依赖注入提供很大帮助,因为它会减少装配应用程序组件时所需的显式装配的数量. 不过,仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配的话,这种歧义性会阻 ...

  6. Spring实战(六)自动装配的歧义性

    1.Spring进行自动装配时碰到的bean歧义性问题. 在进行自动装配时,只有仅有一个bean匹配所需结果时,才是可行的. 如果不仅仅一个bean能够匹配结果,例如一个接口有多个实现,这种歧义性会阻 ...

  7. 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 ...

  8. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除bean自动装配的歧义@Primary

    一. 假设有如下三个类实现同一个接口,则自动装配时会产生歧义 @Component public class Cake implements Dessert { ... } @Component pu ...

  9. Spring处理自动装配的歧义性

    1.标识首选的bean 2.使用限定符@Qualifier 首先在bean的声明上添加@Qualifier 注解: @Component @Qualifier("cdtest") ...

随机推荐

  1. VisualStudio下如何编译和使用最新版本的OpenCV(修正版)

    OpenCV是托管于GitHub的开源项目,本文具体解决一个问题,就是“获取最新版本的OpenCV,并且在自己的项目中使用起来"   最新版本 2017年3月31日 BY:jsxyhelu ...

  2. 20145216史婧瑶《Java程序设计》第5周学习总结

    20145216 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 异常处理 8.1 语法与继承架构 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生 ...

  3. 20145313张雪纯 《Java程序设计》第1周学习总结

    20145313 <Java程序设计>第1周学习总结 教材学习内容总结 java有三大平台,分别为Java SE(J2SE).Java EE(J2EE).Java ME(J2 ME). J ...

  4. RocEDU.阅读.写作《乌合之众》(四)

    第三卷 不同群体的分类及特点 第二章 被称为犯罪群体的群体 通常,群体犯罪的动机是暗示,参与人认为自己是在履行责任,和平常的犯罪大不相同.犯罪者服从于别人的怂恿,而这种力量在群体中格外强大,犯罪者受到 ...

  5. 20145327实验三 敏捷开发与XP实践

    敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 程序缩进: 结对git的应用 PSP 步骤 耗时 百分比 需求分析 15m 12.5% 设计 30m 25% 代码实现 45m 37.5 ...

  6. 《JAVA程序设计》第五次实验报告

    20145333 实验五 Java网络编程及安全 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:3 ...

  7. GCC精彩之旅

    在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器.目前Linux下最常用的C语言编译器是GCC(GNU Compile ...

  8. django中的分页设置

    1.在控制台中的展示 from django.core.paginator import Paginator iter = 'abcdefghijklmn' inator = Paginator(it ...

  9. hadoop 编译任意版本的eclipse 插件

    github地址 下载ant并进行配置 http://ant.apache.org/bindownload.cgi 解压后, sudo gedit /etc/profile 进行设置: 添加expor ...

  10. gdb 调试coredump文件过程:

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到进程的pid 2.gdb -p pid ...