Spring @Autowired 知其然定需知其所以然 第一弹
@Autowired 想必大家都不陌生吧,基本上是日常开发必用,本系列将逐一对它进行记录说明,层层剖析。欢迎大家留言讨论,感谢支持~
文章目录
- 作用范围
- 介绍一下@Autowired
- @Autowired 装配过程
- 自动装配的歧义性
- @Primary
- @Qualifier
作用范围
咱们先来看一张图,了解一下 @Autowired
的作用域;
@Autowired
的作用范围,其实在Spring注解源码中,就已经说明:
看到 @Target
中的目标对象了吧,这图咱不瞎掰。
介绍一下@Autowired
知道大家都会,都明白,这里我就在啰嗦一点,再说一次,温故而知新嘛
提供者:Spring
装配方式:支持
byType
和byName
两种方式,默认情况下是按照beType
方式装配(类型装配),如果是失败了再通过byName
进行注入。注解参数:
@Autowired
中有一个required
参数,默认值为true
,表示会自动开启装配,当然如果需要关闭自动装配,可以给该参数赋值为false
。
@Autowired(required = false)
在大多数情况下都推荐使用 @Autowired
注解,因为它是由 Spring IoC 自动装配完成的,使得配置大幅度减少,满足约定优于配置的规则,增强程序的健壮性。
@Autowired 装配过程
图直接扔这了,不藏不掖好吧。
自动装配的歧义性
在大部分情况下,项目中使用的都是接口变成,一个接口可以有多个实现类,在这种情况下,@Autowired
默认自动按照类型进行装配的方式就不能使用了。
首先,约定以下场景:
代码示例一:
// =============== controller begin ================
@RestController
@RequestMapping("/unauth")
public class AnimalController {@Autowiredprivate AnimalService animalService;@GetMapping("/getCry")public String getCry(){return animalService.getCry();}
}
// =============== controller end ================// =============== service begin ================/*** @className: AnimalService* @description: 动物类*/
public interface AnimalService {String getCry();
}
// =============== service end ================// =============== serviceImpl begin ================/*** @className: CarServiceImpl* @description: 猫类*/
@Service
public class CarServiceImpl implements AnimalService {@Overridepublic String getCry() {return "喵喵喵";}
}/*** @className: CarServiceImpl* @description: 狗类*/
@Service
public class DogServiceImpl implements AnimalService {@Overridepublic String getCry() {return "汪汪汪";}
}/*** @className: CowServiceImpl* @description: 牛类*/
@Service
public class CowServiceImpl implements AnimalService {@Overridepublic String getCry() {return "哞哞哞";}
}
// =============== serviceImpl end ================
示例一中的代码,启动就会直接失败,如下图所示:
像这种情况,Spring也提供了消除歧义性的方法,需要使用到另外两注解来辅助使用,分别是 @Primary
和 @Qualifier
。
下面给大家说一说这两个小兄弟~
@Primary
当Spring IoC通过一个接口或抽象类注入对象的时候,假如存在多个实现类或具体类,这时Spring就不知道具体需要选用哪一个类注入,@Primary
注解的作用则是告诉Spring IoC容器,优先使用被 @Primary
标注类来注入。
在代码示例一中加入 @Primary
:
/*** @className: CarServiceImpl* @description: 猫类*/
@Primary
@Service
public class CarServiceImpl implements AnimalService {@Overridepublic String getCry() {return "喵喵喵";}
}
设置完成后,让我们再访问看看:
这里的 @Primary
注解标注了 CarServiceImpl 类,告诉 Spring IoC 容器,如果存在多个 AnimalService 类型时,优先将 CarServiceImpl 类注入,这样就解决了自动装配的歧义性。
想一想,如果我们同时在 CarServiceImpl 类和 DogServiceImpl 类上使用 @Primary
,这是就会存在两个首选注入项 AnimalService 接口的实例了,这样定义在 Spring IoC 中是允许出现的,但是在注入时会抛出异常:
所以,说明了 @Primary
只能解决首选 Bean 的问题,而不能解决选择性的问题(出现多个首选注入项时)。
那么我们该怎么去解决选择性的问题呢?
别着急,这不我们的第二小兄die就来了吗~
@Qualifier
上述歧义性问题出现的原因,在于 Spring 寻找依赖注入的时候是按照类型注入引起的。其实在 Spring IoC 容器的最底层接口 BeanFactory,也定义了按名称查找的方法, @Qualifier
就是这个方法的具体引用。
Spring 源码示例:
public interface BeanFactory {Object getBean(String name) throws BeansException;
}
@Qualifier
注解标注后的 Bean 可以按照名称查找的方式,从 IoC 容器中获取对象进行注入。
代码示例二:
@RestController
@RequestMapping("/unauth")
public class AnimalController {@Autowired@Qualifier("dogServiceImpl")private AnimalService animalService;@GetMapping("/getCry")public String getCry(){return animalService.getCry();}
}
访问成功:
Spring @Autowired 知其然定需知其所以然 第一弹相关推荐
- STL之string类:知其然,需知其所以然
目录 前言 一,构造及初始化 1.1constuct类函数 1.2构造函数及其模拟实现 1.3拷贝构造及其模拟实现 1.4赋值操作符 1.5string类的swap接口 二,迭代器 2.1初识迭代器即 ...
- 预测师的随想系列五:知其然重要,知其所以然更重要
五个理由 1.你不了解的东西随便用了,出问题谁来负责,你. 2.知其然是基础,知其所以然是更高层次的追求. 3.打造技术领导力,你要比别人懂得更深更多才可以做领导. 4.长期知其然,就可能再也无法跳出 ...
- 知其然,而不知其所以然
求一个题:find dy/dx for the function y defined implicitly by y^4+xy=4 at x=3, y=1. 做的时候将D(xy) 计算为y. 其实自己 ...
- 知其然更要知其所以然,聊聊SQLite软件架构
SQLite是一个非常受欢迎的数据库,在数据库排行榜中已经进入前十的行列.这主要是因为该数据库非常小巧,而且可以支持Linux.Windows.iOS和Andriod的主流的操作系统. SQLite非 ...
- 招商银行的“金融+知识”:知其然,更要知其所以然
一个更加成熟.健康的金融市场,需要更加成熟.理性的用户来焕发勃勃生机:一个具备公信力的金融机构所做出的持续化.专业化金融知识输出,也将大大增加与用户之间的连接和信任. 这种相互成就的关系,正是服务1亿 ...
- 程序员需知的 58 个网站,墙裂推荐!
点击"开发者技术前线",选择"星标????" 让一部分开发者看到未来 文章来源:cnblogs.com/three-fighter/p/13641835.htm ...
- 终于明白那些年知其然而不知其所以然的iOS内存管理方式
终于明白那些年知其然而不知其所以然的iOS内存管理方式 前言 从我开始学习iOS的时候,身边的朋友.网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于1则对象保存在内存的堆中而引用 ...
- 知其然,知其所以然之Java基础系列(一)
相信大家在最初接触Java基础学习的时候,也只是跟着课本上的描述学习,知其然,不知所以然,要想成为一个Java老鸟,不仅要学会怎么用,也要知道为何这么用.在Java基础系列的博客中,我会列举一系列大家 ...
- Java0基础学习笔记、心得-day01(Java入门需知、Java入门概述、Java语言相关知识、JDK与JRE关系,常用DOS命令、JDK的下载安装与HelloWorld案例实现与常见问题。)
一.Java入门需知 * 1.你为什么要学习编程?--兴趣.职业.薪资? * 2.具体Java开发岗位薪资可以参考-智联招聘 前程无忧 BOSS直聘等APP * 3.如何进入IT行业:前端工程师 ...
最新文章
- lvs keepalived
- ajax的核心有哪些,ajax的核心
- 开启redis远程客户端连接
- 电脑知识:如何保养自己的电脑,看完你就懂了!
- DataGear 1.13.1 发布,数据可视化分析平台
- python如何输入数据形成列表_将Python字典/列表插入到SQL数据库中最有效的方法是什么?...
- MATLAB 常用绘图命令
- 简单几步解决 svchost 占用资源过高的问题
- 【Windows】安装openslide遇到的问题及解决办法
- 电脑开启wifi热点
- 深度学习之epoch
- win7没有显示wifi连接到服务器地址,Win7连接wifi出现感叹号
- 基于小程序同城交易系统设计 同城小程序校园二手交易小程序毕业设计课题选题毕设毕业设计论文
- 自适应滤波器原理——新息过程
- bit和byte以及千字节关系
- 礼品定制APP开发的功能
- PHP笔试题和面试题汇总
- 什么是Deeply Embedded Systems?
- 幸福的瑞星卡卡狮 郁闷的江民防火墙
- 手机钢琴键盘模拟器好用吗?