spring依赖注入的三种方式以及优缺点

一.依赖注入的三种方式

1.通过构造器注入。(spring4.3之后,推荐使用)

2.通过setter注入。(spring4.3之前,推荐使用)

3通过filed注入。

二.三种方式的代码示例:

Constructor注入

    private AlarmContactService alarmContactService;private final AlarmService alarmService;private final SysUserService sysUserService;@Autowiredpublic AlarmContactController(AlarmContactService alarmContactService, AlarmService alarmService,SysUserService sysUserService) {this.alarmContactService = alarmContactService;this.alarmService = alarmService;this.sysUserService = sysUserService;}

Setter注入

private AlarmContactService alarmContactService;private AlarmService alarmService;private SysUserService sysUserService;@Autowiredpublic void setAlarmContactService(AlarmContactService alarmContactService) {this.alarmContactService = alarmContactService;}@Autowiredpublic void setAlarmService(AlarmService alarmService) {this.alarmService = alarmService;}@Autowiredpublic void setSysUserService(SysUserService sysUserService) {this.sysUserService = sysUserService;}

Field注入

    @Autowiredprivate AlarmContactService alarmContactService;@Autowiredprivate AlarmService alarmService;@Autowiredprivate SysUserService sysUserService;

三.3种方式的各优点和缺点

三种方式的优点分析

1.基于构造器注入,会固定依赖注入的顺序,不允许我们创建的bean对象之间存在循环依赖关系,这样Spring能解决循环依赖的问题。

2.基于setter注入,只有对象是需要被注入的时候,才会注入依赖,而不是在初始化的时候就注入。

3.在成员变量上写上注解来注入,这种方式,精短,可读性高,不需要多余的代码,也方便维护。

三种方式的缺点分析

1.使用构造器注入的缺点是,当我们构造器需要注入的对象比较多时,会显得我们的构造器,冗余,不美观,可读性差,也不易维护。

2.当我们选择setter方法来注入的时候,我们不能将对象设为final的;

3.当我们在field变量上来实现注入的时候

a.这样不符合JavaBean的规范,而且很有可能引起空指针;

b.同时也不能将对象标为final的;

  c.类与DI容器高度耦合,我们不能在外部使用它;

d.类不通过反射不能被实例化(例如单元测试中),你需要用DI容器去实例化它,这更像集成测试;

来自Spring官方文档的建议:  
在Spring 3.x 中,Spring团队建议我们使用setter来注入:

而在Spring 4.x 中,Spring团队不再建议我们使用setter来注入,改为了constructor:

Spring团队通常建议使用构造器来注入,因为它允许一个应用程序组件实现为不可变对象,并确保所需的依赖项不是空。此外构造器注入组件总是返回一个完全初始化状态的client客户端(调用)。附注,大量的构造函数参数是一个糟糕的代码习惯,看起来也很坏,这意味着类可能有太多的责任,应该被重构,以更好地解决适当的关注点分离。

三.解释下什么是循环依赖:

1. 循环依赖是什么?

Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖。

Bean A → Bean B → Bean A     或者 Bean A → Bean B → BeanC → Bean A

2. 循环依赖会产生什么结果?

当Spring正在加载所有Bean时,Spring尝试以能正常创建Bean的顺序去创建Bean。

例如,有如下依赖:

Bean A → Bean B → Bean C

Spring先创建beanC,接着创建bean B(将C注入B中),最后创建bean A(将B注入A中)。

假如,有如下循环依赖:

Bean A → Bean B → Bean C → BeanD → Bean A

但当存在循环依赖时,Spring将无法决定先创建哪个bean。这种情况下,Spring将产生异常BeanCurrentlyInCreationException。

一条Spring 4.3 的新特征:

在Spring 4.3 以后,如果我们的类中只有单个构造函数,那么Spring就会实现一个隐式的自动注入:

就是我去掉了构造器上的@Autowired注解,经测试后发现,程序能正常运行。alarmContactService,alarmService,sysUserService的依赖也被成功注入了。

    private AlarmContactService alarmContactService;private final AlarmService alarmService;private final SysUserService sysUserService;public AlarmContactController(AlarmContactService alarmContactService, AlarmService alarmService,SysUserService sysUserService) {this.alarmContactService = alarmContactService;this.alarmService = alarmService;this.sysUserService = sysUserService;}

使用构造注入允许加入final,这也表示以后不能再被更改了。

spring依赖注入的三种方式以及优缺点相关推荐

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

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

  2. Spring依赖注入的三种方式(好的 坏的和丑的)

    关于spring bean三种注入方式的优缺点对比,翻译自Spring DI Patterns: The Good, The Bad, and The Ugly,水平有限,如有错误请指正. Sprin ...

  3. spring 依赖注入的三种方式

    @Autowired:构造器,参数,方法,属性:都是从容器中获取参数组件的值: set方法注入: 构造器注入: 作为Bean方法的参数注入: 例子:Boss 注入Car类 第一种.set方式注入 // ...

  4. Spring属性注入的三种方式(超详细)

    属性注入的三种方式 使用set方法进行注入 使用有参构造函数进行注入 使用p名称空间注入 首先了解下面两个名词的含义: IOC:控制反转(Inversion of Control,缩写为IoC),是面 ...

  5. 05.bean依赖注入的三种方式

    05.bean依赖注入的三种方式 1.概述 依赖注入 DI(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现. 在编写程序时,通过控制反转,把对象的创建交给 ...

  6. spring依赖注入的4种方式

    Spring 依赖注入的4种方式 一.Set注入 必须要有setter方法 public class UserDao {public void test(){System.out.println(&q ...

  7. php依赖注入的三种方式

    控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Inject ...

  8. Spring系列之依赖注入的三种方式

    目录 一.依赖注入方式 1.使用属性的setXXX方法注入 2.构造函数注入 (1)按类型匹配入参type (2)按索引匹配入参index (3)联合使用类型和索引匹配入参[type和index一起使 ...

  9. 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入

    本文主要讲解Spring开发中三种不同的注入方式,以及集合数据类型的注入,仅供学习分享使用,如有不足之处,还请指正. 概述 Spring的注入方式一共有三种,如下所示: 通过set属性进行注入,即通过 ...

最新文章

  1. 【精简教程版】100行代码入手天池CV赛事
  2. 太强了,手撸一款导弹跟踪算法(Python版)
  3. 使用Python将Excel中的数据导入到MySQL
  4. 玛氏携手阿里 天猫网罗全球快消三巨头
  5. java双引号的转义字符_JAVA中转义字符
  6. requirements.txt一键安装项目所需要的的python包
  7. 详细介绍nagios基本配置
  8. php基础_变量和比较符
  9. 水产饲料造粒机行业调研报告 - 市场现状分析与发展前景预测
  10. 掌握rm命令删除文件
  11. HTML中的图像和链接
  12. Elastic ik插件配置热更新功能
  13. makefile(详细讲解)
  14. Struts2 教程 流程
  15. MSP430F5529-基于ATK-IMU901角度传感器在UART的串口通信于数据显示
  16. Python GUI教程:信号、槽、事件
  17. Mongodb高级查询Aggregation聚合组件分页
  18. ANSYS软件许可证优化,高效提升工作效率
  19. 计算机桌面没有有了怎么添加,电脑里没有便签小工具怎么办?办公电脑上怎么添加一款方便记事的桌面便签软件...
  20. CST微波工作室学习笔记—17.CST和HFSS联合导入、导出模型+仿真

热门文章

  1. 博客园安卓客户端合仔茶版本V5正式发布
  2. Matlab之BP神经网络学习------ Day 1
  3. 数据挖掘 (1) 基础篇
  4. MD5加密概述,原理以及实现
  5. 基于mediapipe和KNN算法的深蹲/引体向上计数检测【mediapipe】【BlazePose】【KNN邻接算法】
  6. 使用mysqladmin管理配置mairadb
  7. python横线怎么打_Python中的各种下划线
  8. Python串口操作
  9. 基于MQTT协议的 org.eclipse.paho.client.mqttv3 源码学习(二)
  10. python+django健身房课程预约评分系统