解决多类型冲突的三种方式(@Primary、@Qualifier注解)
目录标题
- 知识预热
- @Autowired(先byType后byName)
- @Qualifier(byName)
- @Primary(byType)
- @Primary和@Qualifier注解的作用
- 注入多个相同类型示例
- 代码
- 启动时报错
- 注意点
- 解决方式
- 方式1 - 变量名称
- 方式2 - @Primary
- 方式3 - @Qualifier
知识预热
@Autowired(先byType后byName)
实际项目中,@Autowired,
默认是byType注入
,当发现多个实现类的时候,@Autowired会根据byName的方式注入
,name默认就是根据变量名
来的。
下面的例子中,则是先根据 UserService.class(先通过类型),然后根据 userService的name(再通过名字):
@Autowired
private UserService userService;
@Qualifier(byName)
配合@Autowired使用。用于指定通过name匹配bean。
注入时的限定符,用来指定注入哪一个实现类。通过byName的方式实现。
该例显示将注入name为customService的实现类:
@Autowired
@Qualifier("customService")
private UserService userService;
@Primary(byType)
在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的(如果类型找不到,再通过name查找。name指的是变量名
)。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。
注意:@Primary只会让一个bean生效。
使用@Autowired注解执行注入时,默认是byType,当Spring容器中存在多个相同类型的Bean实例时,@Primary注解可以添加在类上,指定优先注入的Bean实例。
@Bean
@Primary
public Employee johnEmployee() {return new Employee("john");
}
@Primary和@Qualifier注解的作用
@Primary和@Qualifier注解,都是处理@Autowired注入时,发现多个相同类型的冲突
时,进行解决。
注入多个相同类型示例
代码
public interface Singer {String sing(String lyrics);
}
有下面的两个实现类:
@Component // 加注解,让spring识别
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}========================================
@Component
public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}或者继承MetalSinger:@Component
public class OperaSinger extents MetalSinger {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;}
}
下面就是注入上面的接口实现类:
@Component
public class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;public String sing(){return singer.sing("song lyrics");}
}
启动时报错
有趣的事情就会发生,当你项目启动的时候会发现一个错误的结果或异常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger
.
提示很明确了,spring 根据类型无法选择到底注入哪一个。
注意点
- Singer的两个实现类MetalSinger、OperaSinger在IOC容器中的beanName分别是
metalSinger
、operaSinger
; - 而我们使用Singer的时写的变量名字为
singer
; - 我们都知道@Autowired默认通过byType从IOC中寻找bean,然后找到了两个bean;
- 为了确认具体是哪个bean实例,然后再通过byName寻找(也就是变量名singer)发现没有;
- 因此报错。
解决方式
方式1 - 变量名称
根据
解决多类型冲突的三种方式(@Primary、@Qualifier注解)相关推荐
- 什么是同源策略及解决跨域的三种方式
同源策略 1.1.1 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略/SOP(Same origin policy)是一种约 ...
- 使用小乌龟TortoiseGit快速解决代码冲突的三种解决方法:
使用小乌龟TortoiseGit快速解决代码冲突的三种解决方法: 1.Resolved:手动查看并解决完冲突以后使用. 2.Resolve conflict using "CHERRY_PI ...
- java 循环依赖_浅谈Spring解决循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- vue 函数 路由跳转_vue中通过路由跳转的三种方式
router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...
- 前端实现跨域的三种方式
前端解决跨域的三种方式: 1.cors跨域(只需要后端配置) header("Access-Control-Allow-Origin:*"); // 允许任何来源 header(& ...
- $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式
这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题.大家可以收藏起来,以备用时之需! 1.同源策略 1.1 含义 ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略&q ...
- Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题
文章目录 前言 一.Spring 容器警告的产生 1.1.项目场景 二.Spring 容器未关闭后果分析 2.1.肉眼可见的警告 2.2.导致的内存泄漏 2.2.1.什么是内存泄漏? 2.2.2.如何 ...
- Qt工作笔记-三种方式解决Qt5中文编码问题
目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用. 把这三种方法顺序试下 ...
- AJAX异步请求解决跨域问题的三种方式
一 什么是跨域 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说We ...
最新文章
- Android线程管理(一)
- 滥用网络爬虫技术,多家公司被查!互金行业风控外包时代终结
- webpack4.x开发环境配置
- php的array跟go的array,实现类似php的array_column方法
- linux 操作mysql 数据库命令_在Linux上用命令怎么连接数据库
- 为什么工厂招人越来越不容易?是招工难还是待遇低?
- 软件版本GA,RC,alpha,beta,Build 含义
- jsmind结合php,thinkCMF5与jsMind实现文章Mind版
- 在ThemeForest上销售的利弊
- 这应该是把春秋招讲的最清楚的文章了,不接受反驳
- [NN]前向神经网络的tf.keras详细实现教学
- java openCV调用摄像头并以窗体显示出来
- Java项目运维与监控调优
- [GDOI2016][树链剖分+主席树]疯狂动物城
- 反激式开关电源-手机充电器5V/1A
- 译:WebRTC视频通信
- 云计算技术基础 第2章 云计算的架构及国内外标准化情况(2)
- 全志平台ubuntu14.04+安卓7.1+openjdk-8编译
- Linux多线程学习(七)sched_yield
- 成都16条新经济优势赛道解读之5G大数据