一、前言

​ Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由Spring的IOC容器管理,将对象的依赖关系由Spring控制,避免硬编码所造成的过度程序耦合。前几天的时候,笔者的同事问我为什么要使用构造器的注入方式,我回答说因为Spring文档推荐这种,而说不出为什么 T^T,后面抽时间了解了一下,下面就是笔者要讨论的就是其注入方式。

二、常见的三种注入方式

2、1 注解注入

笔者为了方便起见就只是用注解的方式注入(现在也很少使用xml了吧,(~ ̄▽ ̄)~)

Controller
public class FooController {@Autowired//@Injectprivate FooService fooService;//简单的使用例子,下同public List<Foo> listFoo() {return fooService.list();}
}

这种注入方式应该是笔者目前为止开发中见到的最常见的注入方式。原因很简单:
注入方式非常简单:加入要注入的字段,附上@Autowired,即可完成。使得整体代码简洁明了,看起来美观大方。

2、2 构造器注入

Controller
public class FooController {private final FooService fooService;@Autowiredpublic FooController(FooService fooService) {this.fooService = fooService;}//使用方式上同,略
}

在Spring4.x版本中推荐的注入方式就是这种,相较于上面的field注入方式而言,就显得有点难看,特别是当注入的依赖很多(5个以上)的时候,就会明显的发现代码显得很臃肿。对于从field注入转过来+有强迫症的园友 来说,简直可以说是石乐志 (`Д´*)9。对于这一点我们后面再来讨论,别急。

2.3 setter注入

@Controller
public class FooController {private FooService fooService;//使用方式上同,略@Autowiredpublic void setFooService(FooService fooService) {this.fooService = fooService;}
}

在Spring3.x刚推出的时候,推荐使用注入的就是这种,笔者现在也基本没看到过这种注解方式,写起来麻烦,当初推荐Spring自然也有他的道理,这里我们引用一下Spring当时的原话:

The Spring team generally advocates setter injection, because large numbers of constructor arguments can get unwieldy, especially when properties are optional. Setter methods also make objects of that class amenable to reconfiguration or re-injection later. Management through JMX MBeans is a compelling use case.
Some purists favor constructor-based injection. Supplying all object dependencies means that the object is always returned to client (calling) code in a totally initialized state. The disadvantage is that the object becomes less amenable to reconfiguration and re-injection.

简单的翻译一下就是:构造器注入参数太多了,显得很笨重,另外setter的方式能用让类在之后重新配置或者重新注入。
那么后面为什么又换成构造器注入了呢?(喂喂喂,Spring你前一大版本还贬低构造器注入,后面就立刻捧人家了不好吧,不过能用于承认自己的错误,才是真正令人称赞的地方吧 (๑•̀ㅂ•́)و✧)

三、构造器注入的好处

Spring官方写的这个构造器注入可以保证注入的组件不可变,因为组件是用final修饰的,另外可以保证组件不为空。此外返回给客户端的时候保证组件是完整初始化后的状态。
下面来简单的解释一下:

1、依赖不可变:其实说的就是final关键字,这里不再多解释了。不明白的园友可以回去看看Java语法。
2、依赖不为空(省去了我们对其检查):当要实例化FooController的时候,由于自己实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要Spring容器传入所需要的参数,所以就两种情况:1、有该类型的参数->传入,OK 。2:无该类型的参数->报错。所以保证不会为空,Spring总不至于传一个null进去吧

Spring的构造器注入相关推荐

  1. Spring的三种注入方式(为什么推荐构造器注入?)

    Spring的三种注入方式 一.属性注入 @Resource和@Autowired的区别 为什么尽量使用 @Resource? 二.setter 注入 三.构造器注入 具体可以看看Spring官网 为 ...

  2. Spring构造器注入循环依赖的解决方案及原理探索

    前言 我们都知道Spring解决了Setter注入或者Field注入的循环依赖问题,依靠的是三个Map(earlySingletonObjects.singletonFactories.singlet ...

  3. Spring的依赖注入方法

    文章目录 Spring中依赖注入的方法 基于构造方法的注入 根据索引赋值 根据所属类型传值 根据所属类型传值(不推荐) 基于setter注入 基于接口的注入(不常用,这里不说明了) 拓展方式注入 P命 ...

  4. Spring官方为什么建议构造器注入?

    以下文章来源方志朋的博客,回复"666"获面试宝典 前言 本章的内容主要是想探讨我们在进行 Spring 开发过程当中,关于依赖注入的几个知识点.感兴趣的读者可以先看下以下问题: ...

  5. Spring为什么建议构造器注入?

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/6844904056230690824 前言 本章的内容主要是想探讨我们在进 ...

  6. 对不起,我就是喜欢问你Spring构造器注入原理

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:这样配置:让你的 IDEA 好用到飞起来文章转自:码农沉思录 我的小站:个人小站,欢迎小憩 作者:Static_ ...

  7. 深度分析Spring中的构造器注入

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/z69183787/article/details/108902510 1. 示例 先来看一个例子,看看什么是构造器注入. 这里 ...

  8. spring的注入(set注入、构造器注入)

    目录 一.介绍 1.set注入和构造器注入是什么? 2.通俗的理解 3.set注入和构造器注入的核心原理 4.set注入和构造器注入的类型 5.set注入的外部bean和内部bean 二.set注入和 ...

  9. spring:setter注入构造器注入注解注入

    一.内容回顾 简述对spring框架的了解 优点 高内聚低耦合 可拔插式设计模式 XML配置 便于维护 Sping 可以和各大优秀的框架很好结合(Struts2 springmvc mybatis h ...

最新文章

  1. C++官方自带可持久化平衡树rope的3000行源码
  2. LeetCode: 38. Count and Say
  3. codeforces316E3
  4. C++中const用法总结
  5. 缓存-SpringCache-自定义缓存配置
  6. 百度EasyDL深度学习实战营,免费教你转型AI工程师!
  7. python里default_新手对python default不是很理解它有什么用途
  8. 支付宝澄清使用华为方舟编译器;三星苹果遭遇集体诉讼;PHP 7.4.0 beta4 发布 | 极客头条...
  9. js或jsp 获取项目路径常用方法
  10. 小白的一周学习汇总!
  11. matlab将日线编成周线,通达信公式日线10周线调用,请教通达信日线数据上引用周线数据需要用到的函数和方法...
  12. 树莓派舵机 c语言,树莓派控制SG90舵机
  13. iOS 【陀螺仪 自身旋转角水平面夹角 问题】
  14. Tableau 2018.2 安装与破解记录
  15. mysql建表语句转oracle_求大神将该MySQL建表语句改为oracle的,感激不尽。
  16. python中append函数什么意思_在python中append()函数的作用是什么
  17. springboot 内存参数 启动
  18. 长沙南站启动脸部识别验证验票;奔驰和美国无人机物流公司公司合作用无人机配送商品...
  19. Linux进程间关系之终端与终端登录
  20. clickhouse连接Tableau

热门文章

  1. macbook 插上移动硬盘后 WIFI 上不了网的解决办法
  2. 分治法解决计算凸包问题
  3. RK平台--EVS模块: (二)EVS框架介绍
  4. 漫画 | 媳妇,去帮我放水泡个澡~
  5. 实测拼多多售假小米电视机 商家:不是原厂
  6. CF 584A Olesya and Rodion
  7. 基于Vue3的排班日历方案
  8. 翁恺老师 狐狸和兔子练习
  9. access mysql odbc驱动程序_64位系统下access的64位odbc驱动
  10. excel自动汇总数据怎么做?