引言

使用@Autowired自动注入时:

如果注入的接口有多个实现类,如下所示:

那么如果不指定具体是哪个实现类的Bean,在Spring Boot启动时就会发生异常(下图请点击查看):

异常的描述信息非常简单,就是告诉开发者,自动注入的地方需要一个Bean,而spring 容器却找到了3个实现类的Bean。

Action(可以采取的行动): 考虑使用@Primary注解或@Qualifier注解。

@Primary

此注解用在类上面,官方解释如下:

简单翻译过来就是,这个注解相当于Spring 的xml配置文件中bean标签里的 primary属性。

它表示在需要自动注入一个单值依赖的地方,却有多个候选依赖,那么这个注解会指定一个类作为preference(偏好)选择。

可以简单理解为,我们把@Primary注解标记在任意一个类上面,在使用@Autowired注入的时候,如果不特殊指明(如何特殊指明请看@Qualifier的讲解),那么默认就注入被@Primary标记的类。

但是只可以指定一个类作为偏好类,否则依然会产生冲突。

@Qualifier

此注解用在属性上、方法上、参数上等,官方解释如下:

翻译过来就是说,这个注解用在属性上,或参数上,在自动注入的时候作为多个候选bean的限定。也可以使用在其他的随后会被用于限定bean的定制注解上。

其实大多数用于属性上和@Autowired一起联用。

这个注解有一个参数:

(default关键字应该是java8中引入的关键字,不过我也是第一次见过这种写法,可能是孤陋寡闻,各位大神轻喷)

稍微思考一下就可以猜到,如果不为@Qualifier注解指定参数那么默认使用类的默认别名,即类的首字母小写,比如:

ChineseTeacher类的默认别名是:chineseTeacher;

EnglishTeacher类的默认别名是:englishTeacher;

MathTeacher类的默认别名是:mathTeacher。

使用默认别名的方法很简单,直接用类的默认别名来命名我们的自动注入对象,如下所示:

Teacher接口有三个实现类:ChineseTeacher、EnglishTeacher、MathTeacher,我们不需要使用@Primary,也不使用@Qualifier,直接在自动注入的变量上使用默认别名,依然可以注入成功。

是的,当我们在自动注入的时候使用类的默认别名,就不会发生候选Bean冲突的问题。

使用@Qualifier或@Primary注解仅仅是在你不想用默认别名来命名注入的bean或是忘记了使用默认别名的情形。

当我们不使用默认别名来使用自动注入功能,我们就需要使用@Qualifier来指定选择的类型,像下面这样:

注意,如果想将ChineseTeacher注入到teacher对象中,就必须给ChineseTeacher类设置别名。

@Service、@Component等注解都可以传入一个字符串作为类的别名。

注意:使用@Qualifier注入bean的时候,它所选取的类的别名需要与具体的类的别名一致,否则会报无法找到指定类型的错误。

总结

罗里吧嗦说了这么多,其实总结起来很简单。

我们自动注入的时候,如果有多个候选实现类的bean,spring boot启动的时候就不知道该选择哪个bean进行注入,因此会报错。

使用@Primary可以指定一个首选Bean注入;使用@Qualifier可以在自动注入的地方通过传入一个限定名(也就是类的别名)来选取指定的实现类,只不过必须与类的别名一致(如果不传限定名,就使用类的默认别名)

如果既不用@Primary也不用@Qualifier,那就必须在自动注入的时候直接以类的默认别名来命名。

给(spring ioc容器管理的)类设置别名的方式是:@Service("别名")、@Component("别名") 、@Bean("别名") 等等。

Sprint Boot————@Qualifier、@Primary相关推荐

  1. 【Spring注解系列13】Spring自动装配总结:@Autowired、@Resource、@Qualifier、@Inject

    目录 1.@Autowired.@Resource.@Qualifier.@Inject 1).@Autowired 2).@Resource与@Inject 3). @Autowired参数取值 2 ...

  2. key mysql_mysql中key 、primary key 、unique key 与index区别

    mysql中索引是非常重要的知识点,相比其他的知识点,索引更难掌握,并且mysql中的索引种类也有很多,比如primary key .unique key 与index等等,本文章向大家介绍mysql ...

  3. R语言编写自定义函数计算R方、使用自助法Bootstrapping估计多元回归模型的R方的置信区间、可视化获得的boot对象、估计单个统计量的置信区间、分别使用分位数法和BCa法

    R语言编写自定义函数计算R方.使用自助法Bootstrapping估计多元回归模型的R方的置信区间.可视化获得的boot对象.估计单个统计量的置信区间.分别使用分位数法和BCa法(Bootstrapp ...

  4. Spring中@Autowired、@Qualifier、@Resource的区别

    转自: Spring中@Autowired.@Qualifier.@Resource的区别_老周聊架构的博客-CSDN博客_qualifier和resource区别1.@Autowired@Autow ...

  5. SQL_菜鸟教程_unique、primary key、foreign key

    SQL_unique.primary key.FOREIGN KEY insert into select create 约束Constraints *** not null_添加.修改 unique ...

  6. Spring 注解 @Qualifier和@Primary 详细解析

    1. 概述 今天带你了解一下 Spring 框架中的 @Qualifier 注解,它解决了哪些问题,以及如何使用它.我们还将了解它与 @Primary 注解的不同之处. 2. 痛点 使用 @Autow ...

  7. MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别

    文章目录 一.背景知识 二.MySQL 中 KEY 与 INDEX 区别 三.key的总结和分类 四.INDEX索引介绍 五.PRIMARY KEY 和 UNIQUE KEY 的区别 六.操作索引 一 ...

  8. 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控--转

    原文地址:http://mp.weixin.qq.com/s?__biz=MzAxODcyNjEzNQ==&mid=2247483789&idx=1&sn=ae11f04780 ...

  9. springboot有什么好的方案实现 数据实时更新吗?_使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控...

    Spring Boot Actuator通过/metrics端点,以开箱即用的方式为应用程序的性能指标与响应统计提供了一个非常友好的监控方式. 由于在集群化的弹性环境中,应用程序的节点可以增长.扩展, ...

最新文章

  1. 写给开发向产品转型的同学的3句话
  2. c# 通过字体对话框获取字体名称和字体大小_PS插件神器 :fonTags,超好用的PS字体管理插件(附安装方法)
  3. 编译实验(一)词法分析
  4. python中常见的15中面试题
  5. [bzoj4592] [Shoi2015]脑洞治疗仪
  6. Typora、github中的markdown不同的行间距
  7. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月5日-8月12日)
  8. 查看系统中支持CUDA的设备数量和属性---deviceQuery示例
  9. Jmeter之__CSVRead随机读取变量
  10. Asp.Net Web API 2第十四课——Content Negotiation(内容协商)
  11. 旋转链表 Java,leetcode 旋转链表 Java
  12. 最详细的java思维导图
  13. html表单界面设计,ui界面表单设计的三个方面
  14. 关于蓝牙打印机的一些问题
  15. 鸿蒙操作系统详细流程,鸿蒙系统的启动流程
  16. JavaScript去除字符串中所有的标点符号,只保留中文、英文和数字
  17. java web中 生成图片验证码,转自逍遥郎
  18. Unreal引擎术语表
  19. CSDN社区关于水晶报表的讨论
  20. python列表嵌套合并成一个列表

热门文章

  1. kotlin 扩展类的功能_Kotlin程序| 扩展功能功能
  2. scala 字符串转换数组_如何在Scala中将十六进制字符串转换为字节数组?
  3. 一文彻底搞懂Java中的值传递和引用传递!
  4. 漫画:什么是归并排序?
  5. ASP.NET 缓存 Cache
  6. kubernetes集群使用GPU及安装kubeflow1.0.RC操作步骤
  7. oracle11g arm,想知道ARM11架构?这篇介绍告诉你
  8. commonjs 和 es6模块化开发入门
  9. java单线程上锁_关于Java多线程编程锁优化的深入学习
  10. php搭建云服务器,云服务器上如何搭建php环境