Spring自动装配@Autowired的三种方式
转自:https://ahaochan.github.io/Java/JavaWeb/Spring/Spring%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D@Autowired%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E5%BC%8F.html
前言
在IDEA升级2017版后,发现以前使用的@Autowired
出现了个警告Field injection is not recommended
。
虽然不是异常,但就是看着不舒服,所以google了一下,发现了stackoverflow 已经有人提了这个问题,并得到了解答。
@Autowired的不推荐用法
在一个Bean内,可以使用@Autowired
注入另一个Bean。
1
2
3
4
5
6
7
8
9
|
@Component
public class Dependency(){
}
@Component
public class DI(){
@Autowired
private Dependency dependency;
}
|
事实上,这就是我平常使用的方式,直接在Field
上添加注解,简洁又好看。
但这是不推荐的使用方法。
@Autowired的三种使用方式
- 通过构造器注入
- 通过setter方法注入
- 通过field反射注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class DI(){
//通过构造器注入
private DependencyA a;
@Autowired
public DI(DependencyA a){
this.a = a;
}
//通过setter方法注入
private DependencyB b;
@Autowired
public void setDependencyB(DependencyB b){
this.b = b;
}
//通过field反射注入
@Autowired
private DependencyC c;
}
|
弊端
如果你使用的是构造器注入
恭喜你,当你有十几个甚至更多对象需要注入时,你的构造函数的参数个数
可能会长到无法想像。
如果你使用的是field反射注入
如果不使用Spring框架,这个属性只能通过反射注入,太麻烦了!这根本不符合JavaBean
规范。
还有,当你不是用过Spring
创建的对象时,还可能引起NullPointerException
。
并且,你不能用final
修饰这个属性。
如果你使用的是setter方法注入
那么你将不能将属性设置为final
。
两者取其轻
Spring3.0官方文档建议使用setter注入覆盖构造器注入。
Spring4.0官方文档建议使用构造器注入。
结论
如果注入的属性是必选
的属性,则通过构造器注入。
如果注入的属性是可选
的属性,则通过setter方法注入。
至于field注入,不建议使用。
Spring自动装配@Autowired的三种方式相关推荐
- Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire
创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...
- spring自动装配Bean的五种方式
no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系 byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配 byType:根据bean的类型 ...
- 装配bean的三种方式
第一种:XML装配 xml装配有两种方式: 第一种:利用有参构造方法注入 User类: package com.liu.xml;import java.util.List; //xml装配bean的两 ...
- Spring注解依赖注入的三种方式的优缺点以及优先选择
当我们在使用依赖注入的时候,通常有三种方式: 1.通过构造器来注入: 2.通过setter方法来注入: 3.通过filed变量来注入: 那么他们有什么区别吗?应该选择哪种方式更好? 代码示例: Con ...
- 记下来 Spring 装配 Bean 的三种方式
ps:拿笔记一下,面试可能会考.依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 前言 什么是依赖注入呢?也可以称为控制反转,简单的来说,一 ...
- spring boot 开启定时任务的三种方式
序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉, ...
- java 循环依赖_浅谈Spring解决循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- @Autowired 注入三种方式
问题 在使用 IDEA 开发 SpringBoot 项目时,在Controller类中使用注解 @Autowired 注入一个依赖出现了警告提示.这是怎么回事? 当我们鼠标停留在警告线处会出现提示:F ...
- spring创建复杂对象的三种方式
什么是复杂对象? 复杂对象是指我们通过new创建不了的对象,此对象的创建还需要别的条件,如jdbc的Connection.mybatis的sqlSesscionFactory. 一.factoryBe ...
最新文章
- ios wallet开发_iOS: 使用UICollectionView实现Wallet效果
- C语言实现方差variance计算(附完整源码)
- C语言:L1-031 到底是不是太胖了 (10分)(解题报告)
- 如何用组策略来找到丢失的文件
- C++学习之路 | PTA乙级—— 1071 小赌怡情 (15 分)(精简)
- Excel比较工具SpreadSheet
- python查看系统句柄数量_查看Linux某个进程打开的文件句柄(file descriptor)数量...
- linux 目录与分区与文件,LINUX中的分区与文件系统
- 过椭圆外一点引两条切线方程_S16-2 二次曲线和圆方程
- matlab进行分子动力学模拟,一种基于分子动力学模拟测试碳纳米管力学性能的方法与流程...
- matlab调和均值滤波_matlab-均值滤波
- Matlab实现图像识别(十)
- 优化 | 线性化:两个0-1变量相乘的线性化
- vuepress+github+versel部署免费个人博客
- 09款苹果笔记本图片_苹果2009-2012款Macbook Pro 13寸笔记本更换硬盘教程
- oracle升序和降序同时存在,oracle升序排序 oracle升序和降序
- 代做matlab程序价格,代做data collection、Matlab设计代写、Matlab代做、代做Matlab编程代写R语言程序|代做R语言编程...
- 中国混合现实产业调研分析及发展战略研究报告2021-2027年版
- oracle remap语句格式,oracle通过expdp的remap_data实现简单的数据脱敏
- 14、系统架构师指南 - 软件项目角色指南系列文章
热门文章
- 神经网络 目标跟踪_图神经网络的多目标跟踪
- vs setup project , 卡死 正在做准备安装
- 【AUTOSAR】AUTOSAR开发工具链(三)----劳特巴赫trace32的使用
- 你所编辑的图文消息可能含有涉嫌不当使用国家机关、国家机关工作人员的名义或形象的表述
- WEX5常用组件介绍
- LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
- vi编辑器全选删除命令ggVGd 全选复制命令(转载)
- 计算机应用基础 清华大学,清华大学出版社-图书详情-《大学计算机应用基础(第2版)》...
- 22考研政治全程班:史纲选择题技巧(1)
- 8uftp不能用,无法读取目录