关于spring依赖注入的方式以及优缺点

 更新时间:2023年07月18日 08:45:43   作者:xiegongmiao  
这篇文章主要介绍了关于spring依赖注入的方式以及优缺点,依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释,这概念是说你不用创建对象,而只需要描述它如何被创建,需要的朋友可以参考下

一.依赖注入的三种方式

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

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

3通过filed注入。

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

Constructor注入

    private AlarmContactService alarmContactService;
	private final AlarmService alarmService;
	private final SysUserService sysUserService;
    @Autowired
	public 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;
	@Autowired
	public void setAlarmContactService(AlarmContactService alarmContactService) {
		this.alarmContactService = alarmContactService;
	}
	@Autowired
	public void setAlarmService(AlarmService alarmService) {
		this.alarmService = alarmService;
	}
	@Autowired
	public void setSysUserService(SysUserService sysUserService) {
		this.sysUserService = sysUserService;
	}

Field注入

    @Autowired
	private AlarmContactService alarmContactService;
	@Autowired
	private AlarmService alarmService;
	@Autowired
	private 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依赖注入的方式以及优缺点的文章就介绍到这了,更多相关spring依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot项目使用 axis 调用webservice接口的实践记录

    SpringBoot项目使用 axis 调用webservice接口的实践记录

    这篇文章主要介绍了SpringBoot项目使用 axis 调用webservice接口,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 浅谈Mybatis之参数传递的几种姿势

    浅谈Mybatis之参数传递的几种姿势

    在mybatis的日常开发中,mapper接口中定义的参数如何与xml中的参数进行映射呢?本文就详细的介绍一下,感兴趣的可以了解一下
    2021-09-09
  • Java面试题冲刺第一天--基础篇1

    Java面试题冲刺第一天--基础篇1

    这篇文章主要为大家分享了最有价值的三道java面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java实现分页的前台页面和后台代码

    Java实现分页的前台页面和后台代码

    这篇文章主要为大家详细介绍了Java实现分页的前台页面和后台代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略的方法

    SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略的方法

    本文介绍了如何使用SpringBoot整合JavaDeeplearning4j构建一个文本摘要生成系统,该系统能够自动从长篇文本中提取关键信息,生成简洁的摘要,帮助用户快速了解文本的主要内容,系统使用LSTM神经网络模型进行训练,并通过SpringBoot创建RESTful API进行调用
    2024-11-11
  • Java异步非阻塞编程的几种方式总结

    Java异步非阻塞编程的几种方式总结

    这篇文章主要介绍了Java异步非阻塞编程的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java集合-HashMap

    Java集合-HashMap

    这篇文章主要介绍了Java集合HashMap,也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,下面来看看文章的具体内容吧,需要的小伙伴也可参考一下
    2022-01-01
  • Mybatis useGeneratedKeys参数用法及问题小结

    Mybatis useGeneratedKeys参数用法及问题小结

    这篇文章主要介绍了Mybatis useGeneratedKeys参数用法及遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • spring事务@Transactional失效原因及解决办法小结

    spring事务@Transactional失效原因及解决办法小结

    今天就跟大家聊聊有关spring中@Transactional失效原因及解决办法小结,主要从三个方面考虑,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • SpringBoot使用Apache POI库读取Excel文件的操作详解

    SpringBoot使用Apache POI库读取Excel文件的操作详解

    在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到需要读取和操作Excel文件的场景,本文将详细介绍如何使用Java中的Apache POI库来读取Excel文件,需要的朋友可以参考下
    2025-01-01

最新评论