一:装配的歧义性:
发生原因:装配的接口有多个实现,例如:FirstClass,SecondClass,ThirdClass皆实现了接口SupperClass,当装配SupperCLass时就会出现歧义性,不知装配哪个实现,于是导致装配失败。

解决方法:
第一种:设置优先的Bean:当装配该接口时装配该Bean:
设置方法:

@Component
@Primary
public class FirstClass{}    //设置FirstClass为优先Bean,隐式Bean发现机制设置。--------------------------------------------------------------------
@Bean
@Primary
public FirstClass firstClass()
{return new FirstClass();       //通过Java配置类设置优先Bean
}--------------------------------------------------------------------
<Bean id="firstClass" class="com.FirstClass" Primary="true" />  //通过Xml设置优先Bean

注意:只能设置一个优先Bean 如果设置两个或以上也会导致装配歧义性。


第二种:
使用限定装配的Bean:
1.要使用限定装配的Bean,要使用注解@Qualifier
例如:假设HelloCLass Bean要注入FirstClass Bean,而FirstClass实现了SupperCLass

@Component
public class HelloClass
{private SupperCLass supperClass;@AutoWired@Qualifier("firstClass"(Bean ID))            //这样就是注入FirstClass而不会出现歧义性。public HelloClass(SupperClass supperClass){this.supperClass=supperCLass;}
}
缺点:如果对FirstClass进行重构,改变了类名的话就会导致装配失败
-------------------------------------------------------------------
创建自定义限定符:
这种方法需要两步:
第一步:在要创建Bean的类上使用注解@Qualifier,假设是FirstClass:
@Component
@Qualifier("自定义名字")
public class FirstClass implement SupperClass{}@Component
public class HelloClass
{private SupperClass supperClass;    //隐式的Bean发现机制实现创建自定义限定符@Autowired@Qualifier("自定义名字,要与上面的名字相同")public HelloClass(SupperClass supperClass){this.supperClass=supperClass;}
}
----------------------------------------------------------
使用JavaConfig类实现
@Qualifier("自定义限定符名字")
public class FirstClass implements SupperClass{}@Configuation
public class MyConfig
{@Bean@Qualifier("限定符名字,要与上面的名字相同")public HelloClass helloClass(SupperClass supperClass){return new HelloClass(supperClass);}
}
这样只能添加一个限定符,因为不能再同一条目用两个相同的注解,但是自定义注解可以解决。

三:使用自定义限定符注解

@Target({elementType=CONSTRUCTOR,elementType=METHOD,elementType=FIELD,elementType=TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface 自定义注解名1{}
------------------------------------
@Target({elementType=CONSTRUCTOR,elementType=METHOD,elementType=FIELD,elementType=TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface 自定义注解名2{}
---------------------------------------
使用:
@Component
@注解名1
@注解名2
public class FirstClass implement SupperClass{}@Component
public class HelloClass
{private SupperClass supperClass;    @Autowired@注解名1@注解名2public HelloClass(SupperClass supperClass){this.supperClass=supperClass;}
}

Spring学习之旅(二):Bean的高级装配之解决装配歧义性相关推荐

  1. Spring学习之旅(二) AOP(面向切面编程)的使用

    辛苦堆砌,转载请注明出处,谢谢! 上一篇说了Spring的依赖注入,今天再看看Spring的AOP,牵扯的AOP的理论知识,大家可以搜索一些文章了解一下,这里不做过多解释,本文主要介绍使用Spring ...

  2. HALCON学习之旅(二)

    HALCON学习之旅(二) 文章目录 HALCON学习之旅(二) 1.HALCON用户界面操作符 2.HACLON基础语法 ①.运算符 ②.Tuple数组 ③.字符数字格式化 1.HALCON用户界面 ...

  3. SSE指令集学习之旅(二)

    SSE指令集学习之旅(二) 文章目录 SSE指令集学习之旅(二) 1.BGR->GRAY 2.summarize(归纳总结) 1.BGR->GRAY 知识来源:SSE图像算法优化系列一 代 ...

  4. Spring学习(五)bean装配详解之 【XML方式配置】

    本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原 ...

  5. Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...

    本文借鉴:Spring学习,@Bean 的用法(特此感谢!) 自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器 ...

  6. Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

    本文借鉴:Spring学习(特此感谢!) 通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XM ...

  7. 滴滴Booster移动APP质量优化框架 学习之旅 二

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...

  8. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  9. Spring学习(六)-Bean作用域与基于注解的配置

    Bean作用域 在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.Spring一般采用sc ...

最新文章

  1. 一款比较实用齐全的jQuery 表单验证插件
  2. 会员系统中需要验证用户的邮箱是否真实存在
  3. 遍历二维数组_Java编程基础阶段笔记 day06 二维数组
  4. B 站面试官:“啥是重定向?”
  5. 阿里云的技术创新,不是简单的路线之争
  6. python清空list_python怎么清空list
  7. java 运动_java web 运动前端
  8. 8uftp cuteftp,8uftp cuteftp之间的差别
  9. 怎么使用outlook发送邮件?outlook群发邮件怎么撤回?
  10. 草图logo绘画演绎AE模板
  11. spire.doc操作word文档工具类(自用)
  12. 直击JDD | 京东开启技术服务元年:携手合作伙伴,共创产业未来
  13. 图像处理------图像加噪
  14. VUE进行前后端交互
  15. 请问如何快速画出此图的盒图
  16. linux通过无线网卡上网,在Ubuntu中使用PHS无线网卡上网
  17. 常用putty命令汇总
  18. 什么是字面量?(小白理解
  19. 20款最佳免费英文手写字体推荐
  20. 编程语言发展历程_计算机和编程的发展,个人历程

热门文章

  1. 【HDU5482】Numquam vincar,暴力(da biao)预处理+组合数
  2. 【BZOJ2243】【codevs1566】染色,树链剖分练习
  3. 链表C++ | 从尾部打印头部(使用栈、递归实现)_3
  4. 4.线性和卷积——不同种类的噪声、中值滤波器揭破和实战_5
  5. python中o_Python O
  6. python3爬取教务系统_python requests模拟登陆正方教务管理系统,并爬取成绩
  7. 【英语学习】【WOTD】wiseacre 释义/词源/示例
  8. Intel Core Enhanced Core架构/微架构/流水线 (10) - 先进存储器访问
  9. fwrite函数Matlab,fread和fwrite函数,C语言fread和fwrite函数详解
  10. Win7下使用openssl时出现“Unable to write ‘random state’‘的问题