目录标题

  • 知识预热
    • @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 根据类型无法选择到底注入哪一个。

注意点

  1. Singer的两个实现类MetalSinger、OperaSinger在IOC容器中的beanName分别是metalSingeroperaSinger
  2. 而我们使用Singer的时写的变量名字为singer
  3. 我们都知道@Autowired默认通过byType从IOC中寻找bean,然后找到了两个bean;
  4. 为了确认具体是哪个bean实例,然后再通过byName寻找(也就是变量名singer)发现没有;
  5. 因此报错。

解决方式

方式1 - 变量名称

根据

解决多类型冲突的三种方式(@Primary、@Qualifier注解)相关推荐

  1. 什么是同源策略及解决跨域的三种方式

    同源策略 1.1.1 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略/SOP(Same origin policy)是一种约 ...

  2. 使用小乌龟TortoiseGit快速解决代码冲突的三种解决方法:

    使用小乌龟TortoiseGit快速解决代码冲突的三种解决方法: 1.Resolved:手动查看并解决完冲突以后使用. 2.Resolve conflict using "CHERRY_PI ...

  3. java 循环依赖_浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  4. vue 函数 路由跳转_vue中通过路由跳转的三种方式

    router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...

  5. 前端实现跨域的三种方式

    前端解决跨域的三种方式: 1.cors跨域(只需要后端配置) header("Access-Control-Allow-Origin:*"); // 允许任何来源 header(& ...

  6. $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式

    这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题.大家可以收藏起来,以备用时之需! 1.同源策略 1.1 含义 ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略&q ...

  7. Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题

    文章目录 前言 一.Spring 容器警告的产生 1.1.项目场景 二.Spring 容器未关闭后果分析 2.1.肉眼可见的警告 2.2.导致的内存泄漏 2.2.1.什么是内存泄漏? 2.2.2.如何 ...

  8. Qt工作笔记-三种方式解决Qt5中文编码问题

    目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用. 把这三种方法顺序试下 ...

  9. AJAX异步请求解决跨域问题的三种方式

    一 什么是跨域 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说We ...

最新文章

  1. Android线程管理(一)
  2. 滥用网络爬虫技术,多家公司被查!互金行业风控外包时代终结
  3. webpack4.x开发环境配置
  4. php的array跟go的array,实现类似php的array_column方法
  5. linux 操作mysql 数据库命令_在Linux上用命令怎么连接数据库
  6. 为什么工厂招人越来越不容易?是招工难还是待遇低?
  7. 软件版本GA,RC,alpha,beta,Build 含义
  8. jsmind结合php,thinkCMF5与jsMind实现文章Mind版
  9. 在ThemeForest上销售的利弊
  10. 这应该是把春秋招讲的最清楚的文章了,不接受反驳
  11. [NN]前向神经网络的tf.keras详细实现教学
  12. java openCV调用摄像头并以窗体显示出来
  13. Java项目运维与监控调优
  14. [GDOI2016][树链剖分+主席树]疯狂动物城
  15. 反激式开关电源-手机充电器5V/1A
  16. 译:WebRTC视频通信
  17. 云计算技术基础 第2章 云计算的架构及国内外标准化情况(2)
  18. 全志平台ubuntu14.04+安卓7.1+openjdk-8编译
  19. Linux多线程学习(七)sched_yield
  20. 成都16条新经济优势赛道解读之5G大数据

热门文章

  1. 百度地图多条线段绘制的方法
  2. Android直播APP源码中排行榜功能如何实现
  3. 盗卖Vista可激活密钥现身北京 叫价最低50元
  4. ResultSetMetaData的用法介绍
  5. 基于python的排课表系统_利用python爬取广西科技大学教务管理信息系统班级课表...
  6. 梦想天空(关注前端开发技术 html5+css3)
  7. iOS 改变状态栏的字体颜色
  8. 大牛证券分析近期指数波动在加大
  9. 引入CSS样式的方式
  10. 【Lecture 3.2】 从网络上请求信息