首页 > 其他分享 >为什么Spring推荐使用构造器注入?

为什么Spring推荐使用构造器注入?

时间:2023-12-12 13:55:21浏览次数:32  
标签:依赖 对象 Spring 代码 构造 注解 注入

在说注入时,我们先来回忆一下在Spring中依赖注入的方式

1.setter注入

2.构造器注入

3.基于注解的注入

 

1.setter注入

 

优点:

  1. 灵活性:可以动态地更改依赖对象,而不需要修改类的构造函数。
  2. 可读性:可以清晰地看到类的依赖关系,便于理解和维护。
  3. 测试性:便于进行单元测试,可以通过setter方法注入mock对象。

缺点:

  1. 代码量增加:需要为每个依赖对象编写一个setter方法,增加了代码量。
  2. 对象状态不确定:依赖对象可以在任何时候被更改,可能导致对象状态不确定性。

2.构造器注入

 

优点:

  1. 依赖注入更加明确和直观,可以清晰地看到一个类依赖了哪些其他类。
  2. 可以更容易地进行单元测试,因为可以轻松地用模拟对象替代真实的依赖对象。
  3. 依赖关系更加松散,可以更灵活地替换依赖对象。

缺点:

  1. 如果依赖对象很多,构造函数参数会变得很长,不够简洁。
  2. 如果依赖对象发生变化,需要修改构造函数的参数列表,可能会导致代码的修改量较大。

3.注解注入

 

优点

  1. 代码简洁:通过注解注入,可以减少大量的样板代码,使代码更加简洁易读。
  2. 松耦合:通过注解注入,可以将依赖关系从代码中抽离出来,实现了松耦合,方便进行单元测试和模块替换。
  3. 可维护性:通过注解注入,可以更方便地进行代码维护和重构,减少了代码的耦合度。

缺点:

  1. 难以定位问题:由于依赖关系是通过注解注入的方式实现的,当出现问题时,可能会比较难以定位问题的根源。
  2. 学习成本高:对于初学者来说,理解和使用注解注入可能需要一定的学习成本。
  3. 运行时性能开销:注解注入通常是在运行时进行的,可能会带来一定的性能开销。

现在我们回到问题,为什么Spring推荐使用构造器注入?

Spring官网的一段话

The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.

看不懂?没关系,我给你翻译一下(你也可以自己翻译一下)

这个构造器注入的方式啊,能够保证注入的组件不可变,并且确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态

理清一下思路,做个总结

 

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

    标签:依赖,对象,Spring,代码,构造,注解,注入
    From: https://www.cnblogs.com/WWWHHHJJJBlog/p/17896605.html

相关文章

  • 【转载】Springboot2.x接收参数的多种方式
    参考https://blog.csdn.net/suki_rong/article/details/80445880https://zhuanlan.zhihu.com/p/34597391https://juejin.cn/post/6922469125033820168环境环境版本操作windows10JDK11Springboot2.3.12.RELEASE正文packagecom.example.demo.co......
  • Java-SpringBean的生命周期
    Java-SpringBean的生命周期简单版实例化(Instantiation):当Spring容器启动时,它会检查配置文件或注解,然后实例化所有在配置中声明的Bean。这是通过构造函数或工厂方法进行的。属性设置(PopulationofProperties):容器实例化Bean后,会通过依赖注入或者setter方法将配置的......
  • spring bean的生命周期
    springbean的生命周期分为六个阶段阶段一:容器启动阶段主要完成了扫描、实例化beanDefinitino对象、注册BeanPostProcessor、验证beanDefinition是否合格阶段二:Bean的实例化阶段主要推断实例化方式、实例化对象阶段三:bean的属性注入提前暴露、循环依赖做支持、查找注入信息......
  • springboot下添加日志模块和设置日志文件输出
    前言日志的使用将通过SLF4J来使用,SLF4J(SimpleLoggingFacadeforJava)是一个为Java应用提供简单日志记录的接口。它的主要目标是在不同的日志系统之间提供一个简单的抽象层,使得应用能够以一种灵活的方式切换日志实现,而不需要修改应用本身的代码。SLF4J不是一个具体的日志实现,而......
  • 【SpringBootWeb入门-9】分层解耦-分层解耦(IOC-DI引入)
    1、分层解耦概念上一节我们讲解了三层架构,我们把web程序分为了三层,分别是Conroller控制层、Service业务逻辑层、DAO数据访问层,这一节我们来讲解分层之后的解耦。解耦的含义就是接触耦合,首先我们来介绍两个概念:内聚、耦合。内聚:软件中各个功能模块内部的功能联系。耦合:衡量软......
  • Spring Mvc
    SpringMvcSpringMvc应用(常规使用)MVC架构MVC全名ModelViewController,是模型(model)一个试图(view)一个控制器(controller)的缩写.是一种用于创建Web应用程序表现层的模式Model(模型):包含业务模型和数据模型,数据模型用于封装数据,业务模型用于处理业务View(视图)通常指的就是......
  • SpringBoot+Vue实现大文件分块上传
    1.项目背景由于用户需求,需要上传大量图片,只能通过上传压缩包的形式上传,可是压缩包过大时,又会出现上传超时的情况,故需要将压缩包分块上传,然后解压缩图片、若图片过大则再对图片进行压缩。2.分块上传分块上传我在用的时候发现有两种:第一种:分块合并接口全由后端接口生成;第二种:前端......
  • springboot下添加全局异常处理和自定义异常处理
    前言在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。相关代码:GlobalExceptionHandler类:@Slf4j@RestControllerAdvicepublicclassGlobalExceptionHandl......
  • 关于SQL注入问题及解决--小记
    1.SQL注入问题SQL注入是一种常见的安全漏洞,它发生在应用程序未正确验证和处理用户提供的输入数据时。攻者可以通过恶意构造的输入,将额外的SQL代码注入到应用程序的查询语句中,从而执行未经授权的数据库操作。SQL注入问题通常出现在以下情况下:动态构建SQL查询:如果应用程序直接......
  • 简述一下Spring的两大特性(概念,使用范围。作用等方面简单的阐述
    简述一下Spring的两大特性(概念,使用范围。作用等方面简单的阐述1.控制反转(IoC,InversionofControl):概念:控制反转是Spring框架的核心概念,它指的是将对象的创建、组装和管理的控制权从应用程序代码中反转到Spring容器中。在传统的开发模式中,程序员负责直接创建和管理对象,而在......