Spring学习之旅(二):Bean的高级装配之解决装配歧义性
一:装配的歧义性:
发生原因:装配的接口有多个实现,例如: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的高级装配之解决装配歧义性相关推荐
- Spring学习之旅(二) AOP(面向切面编程)的使用
辛苦堆砌,转载请注明出处,谢谢! 上一篇说了Spring的依赖注入,今天再看看Spring的AOP,牵扯的AOP的理论知识,大家可以搜索一些文章了解一下,这里不做过多解释,本文主要介绍使用Spring ...
- HALCON学习之旅(二)
HALCON学习之旅(二) 文章目录 HALCON学习之旅(二) 1.HALCON用户界面操作符 2.HACLON基础语法 ①.运算符 ②.Tuple数组 ③.字符数字格式化 1.HALCON用户界面 ...
- SSE指令集学习之旅(二)
SSE指令集学习之旅(二) 文章目录 SSE指令集学习之旅(二) 1.BGR->GRAY 2.summarize(归纳总结) 1.BGR->GRAY 知识来源:SSE图像算法优化系列一 代 ...
- Spring学习(五)bean装配详解之 【XML方式配置】
本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原 ...
- Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...
本文借鉴:Spring学习,@Bean 的用法(特此感谢!) 自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器 ...
- Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】
本文借鉴:Spring学习(特此感谢!) 通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XM ...
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- Spring学习(六)-Bean作用域与基于注解的配置
Bean作用域 在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.Spring一般采用sc ...
最新文章
- 一款比较实用齐全的jQuery 表单验证插件
- 会员系统中需要验证用户的邮箱是否真实存在
- 遍历二维数组_Java编程基础阶段笔记 day06 二维数组
- B 站面试官:“啥是重定向?”
- 阿里云的技术创新,不是简单的路线之争
- python清空list_python怎么清空list
- java 运动_java web 运动前端
- 8uftp cuteftp,8uftp cuteftp之间的差别
- 怎么使用outlook发送邮件?outlook群发邮件怎么撤回?
- 草图logo绘画演绎AE模板
- spire.doc操作word文档工具类(自用)
- 直击JDD | 京东开启技术服务元年:携手合作伙伴,共创产业未来
- 图像处理------图像加噪
- VUE进行前后端交互
- 请问如何快速画出此图的盒图
- linux通过无线网卡上网,在Ubuntu中使用PHS无线网卡上网
- 常用putty命令汇总
- 什么是字面量?(小白理解
- 20款最佳免费英文手写字体推荐
- 编程语言发展历程_计算机和编程的发展,个人历程
热门文章
- 【HDU5482】Numquam vincar,暴力(da biao)预处理+组合数
- 【BZOJ2243】【codevs1566】染色,树链剖分练习
- 链表C++ | 从尾部打印头部(使用栈、递归实现)_3
- 4.线性和卷积——不同种类的噪声、中值滤波器揭破和实战_5
- python中o_Python O
- python3爬取教务系统_python requests模拟登陆正方教务管理系统,并爬取成绩
- 【英语学习】【WOTD】wiseacre 释义/词源/示例
- Intel Core Enhanced Core架构/微架构/流水线 (10) - 先进存储器访问
- fwrite函数Matlab,fread和fwrite函数,C语言fread和fwrite函数详解
- Win7下使用openssl时出现“Unable to write ‘random state’‘的问题