转自: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的三种使用方式

  1. 通过构造器注入
  2. 通过setter方法注入
  3. 通过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的三种方式相关推荐

  1. Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire

    创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...

  2. spring自动装配Bean的五种方式

    no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系 byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配 byType:根据bean的类型 ...

  3. 装配bean的三种方式

    第一种:XML装配 xml装配有两种方式: 第一种:利用有参构造方法注入 User类: package com.liu.xml;import java.util.List; //xml装配bean的两 ...

  4. Spring注解依赖注入的三种方式的优缺点以及优先选择

    当我们在使用依赖注入的时候,通常有三种方式: 1.通过构造器来注入: 2.通过setter方法来注入: 3.通过filed变量来注入: 那么他们有什么区别吗?应该选择哪种方式更好? 代码示例: Con ...

  5. 记下来 Spring 装配 Bean 的三种方式

    ps:拿笔记一下,面试可能会考.依赖注入DI和面向切面编程AOP是Spring框架最核心的部分.这次主要是总结依赖注入的bean的装配方式. 前言 什么是依赖注入呢?也可以称为控制反转,简单的来说,一 ...

  6. spring boot 开启定时任务的三种方式

    序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉, ...

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

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

  8. @Autowired 注入三种方式

    问题 在使用 IDEA 开发 SpringBoot 项目时,在Controller类中使用注解 @Autowired 注入一个依赖出现了警告提示.这是怎么回事? 当我们鼠标停留在警告线处会出现提示:F ...

  9. spring创建复杂对象的三种方式

    什么是复杂对象? 复杂对象是指我们通过new创建不了的对象,此对象的创建还需要别的条件,如jdbc的Connection.mybatis的sqlSesscionFactory. 一.factoryBe ...

最新文章

  1. ios wallet开发_iOS: 使用UICollectionView实现Wallet效果
  2. C语言实现方差variance计算(附完整源码)
  3. C语言:L1-031 到底是不是太胖了 (10分)(解题报告)
  4. 如何用组策略来找到丢失的文件
  5. C++学习之路 | PTA乙级—— 1071 小赌怡情 (15 分)(精简)
  6. Excel比较工具SpreadSheet
  7. python查看系统句柄数量_查看Linux某个进程打开的文件句柄(file descriptor)数量...
  8. linux 目录与分区与文件,LINUX中的分区与文件系统
  9. 过椭圆外一点引两条切线方程_S16-2 二次曲线和圆方程
  10. matlab进行分子动力学模拟,一种基于分子动力学模拟测试碳纳米管力学性能的方法与流程...
  11. matlab调和均值滤波_matlab-均值滤波
  12. Matlab实现图像识别(十)
  13. 优化 | 线性化:两个0-1变量相乘的线性化
  14. vuepress+github+versel部署免费个人博客
  15. 09款苹果笔记本图片_苹果2009-2012款Macbook Pro 13寸笔记本更换硬盘教程
  16. oracle升序和降序同时存在,oracle升序排序 oracle升序和降序
  17. 代做matlab程序价格,代做data collection、Matlab设计代写、Matlab代做、代做Matlab编程代写R语言程序|代做R语言编程...
  18. 中国混合现实产业调研分析及发展战略研究报告2021-2027年版
  19. oracle remap语句格式,oracle通过expdp的remap_data实现简单的数据脱敏
  20. 14、系统架构师指南 - 软件项目角色指南系列文章

热门文章

  1. 神经网络 目标跟踪_图神经网络的多目标跟踪
  2. vs setup project , 卡死 正在做准备安装
  3. 【AUTOSAR】AUTOSAR开发工具链(三)----劳特巴赫trace32的使用
  4. 你所编辑的图文消息可能含有涉嫌不当使用国家机关、国家机关工作人员的名义或形象的表述
  5. WEX5常用组件介绍
  6. LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
  7. vi编辑器全选删除命令ggVGd 全选复制命令(转载)
  8. 计算机应用基础 清华大学,清华大学出版社-图书详情-《大学计算机应用基础(第2版)》...
  9. 22考研政治全程班:史纲选择题技巧(1)
  10. 8uftp不能用,无法读取目录