Spring官方真的不建议使用属性进行依赖注入吗?

使用Spring进行依赖注入时,很多大佬都推荐使用构造方法注入,而非使用在属性上添加 @Autowired 注入,而且还说这是Spring官方说的,真的是这样吗?

使用Spring进行依赖主要的方式有很多,主流的使用方式有两种:

  • 1.在属性或者setter方法上使用@Autowired进行注入

  • 2.在构造方法上使用@Autowired进行注入

那么哪种方式更好一点呢?

很巧,在看Spring文档的时候看到了这样一段描述:

在这里插入图片描述

可以参考:Dependency Injection

上面描述主要表达三个信息:

  • 1.两者可以混合使用,对于必须的依赖项,使用构造函数;而对于可选的依赖项,使用setter方法或属性依赖。

  • 2.如果依赖项是不可变的,建议使用构造器进行注入,但是构造器参数过多时,意味着类可能承担了过多的职责,代码就变的不好维护。

  • 3.对于一些三方框架,构造方法或者setter方法没有对外暴露,依赖注入的方式需要根据实际情况进行选择。

如果把以上三点总结成一点的话,就是:根据具体场景进行选择

既然是这样,那么为啥还有大佬一直强调:要使用构造器注入呢?难道大佬没有看文档吗?

我觉得应该是看过了上面的文档,然后才这样强调的,原因在于:

  • 1.为了方便管理和统一编码风格,有些公司会有自己特定的开发模式和规范。

  • 2.同时更加看重构造器注入的带来的好处。

那么使用构造器注入有哪些优点呢?

1.不变性

通过将依赖项设置为 final,我们确保了在对象创建之后,依赖项不能被修改。这提高了代码的可维护性和可预测性。

@Component
public class MyBean {
    private final Dependency1 dependency1;

    // 只有一个构造函数时,可以省略@Autowired
    public MyBean(Dependency1 dependency1) {
        this.dependency1 = dependency1;
    }
}  

2.更清晰的依赖

构造方法注入明确地指定了类所需的依赖项,因此理解代码需要哪些输入变得非常容易。


public class MyBean {
    private final Dependency1 dependency1;
    private final Dependency2 dependency2;

    public MyBean(Dependency1 dependency1, Dependency2 dependency2) {
        this.dependency1 = dependency1;
        this.dependency2 = dependency2;
    }
}

3.可测试性

构造方法注入简化了测试过程,因为我们可以在创建类的实例时很容易地使用 mock 对象替代真实依赖。

public class MyBeanTest {
    @Test
    public void testMyBean() {
        Dependency1 mockDependency1 = Mockito.mock(Dependency1.class);
        Dependency2 mockDependency2 = Mockito.mock(Dependency2.class);

        MyBean myBean = new MyBean(mockDependency1, mockDependency2);

        // ...编写测试用例...
    }
}

4.更容易发现错误

构造方法注入确保必需的依赖在对象创建时就满足,这有助于发现问题并在应用启动期间捕获错误。

public class MyBean {
    private final Dependency1 dependency1;

    public MyBean(Dependency1 dependency1) {
        if(dependency1 == null) {
            throw new IllegalArgumentException("Dependency1 cannot be null");
        }
        this.dependency1 = dependency1;
    }
}

在使用构造器注入的过程中,如果依赖项不断变化,那么每次变化,构造器方法签名就需要不断修改,比较麻烦,这里推荐大家使用一个插件:Lombok

如果你的项目使用了 Lombok 的话,可以使用 @AllArgsConstructor 注解自动生成包含所有成员变量的构造方法。

这样,在添加新的属性时,就不再需要显式地修改构造方法。

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class MyBean {
    private final Dependency1 dependency1;
    private final Dependency2 dependency2;
}

对 Lombok 不熟悉的老铁可以参考:lombok使用与原理介绍

今日分享如果对你有帮助,帮忙点个关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503104.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2核4G云服务器能支持多少人访问?并发数测试

腾讯云轻量应用服务器2核4G5M配置性能测评,腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?并发数10,支持每天5000IP人数访问,腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线?并发数测试、CPU性能、内存性能、…

PID算法控制5840-31ZY编码器直流减速电机旋转特定角度(一)

模块分析 在本工程中,使用stm32做主控芯片输出PWM波,TB6112做电源驱动带动5840-31ZY编码器直流减速电机旋转特定角度 有如下模块 TB6112驱动模块 TB6112是性能优于常见L298N的一款电机驱动芯片,体积更小效率更高发热少 其接线如图&#x…

【3D-GS】Gaussian Splatting SLAM——基于3D Gaussian Splatting的全网最详细的解析

【3D-GS】Gaussian Splatting SLAM——基于3D Gaussian Splatting的定SLAM 3D-GS 与 Nerf 和 Gaussian Splatting1. 开山之作 Nerf2. 扛鼎之作 3D Gaussian Splatting2.1 什么是3D高斯?高斯由1D推广到3D的数学推导2.2 什么是光栅化?2.3 什么是Splatting?2.4 什么是交叉优化?…

互联网医院APP开发攻略:搭建智能医疗平台

互联网医院APP为患者提供了便捷的就医途径,还为医生和医院提供了更加高效的服务和管理手段。接下来,小编将我们本文将就互联网医院APP的开发攻略,以及如何搭建智能医疗平台进行探讨。 1.确定需求和目标 这包括确定服务对象(患者、…

Redis分布式锁红锁

Redisson实现分布式锁 lock()上锁解析: 1,hexist判断redis是否有这个锁 2,hset设置锁,hash类型,key为锁名字,value是一对kv,k是当前redisson1的id,v为计数器,表示当前锁持有次数&am…

基于Springboot的学生选课系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的学生选课系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

ML-Decoder: Scalable and Versatile Classification Head

1、引言 论文链接:https://openaccess.thecvf.com/content/WACV2023/papers/Ridnik_ML-Decoder_Scalable_and_Versatile_Classification_Head_WACV_2023_paper.pdf 因为 transformer 解码器分类头[1] 在少类别多标签分类数据集上表现得很好,但由于其查询…

axios+springboot上传图片到本地(vue)

结果&#xff1a; 前端文件&#xff1a; <template> <div> <input type"file" id"file" ref"file" v-on:change"handleFileUpload()"/> <button click"submitFile">上传</button> </div&g…

2024第17届计算机设计大赛开始啦(保研竞赛)

中国大学生计算机设计大赛是面向高校本科生的竞赛&#xff0c;旨在培养创新型、复合型、应用型人才。2024年大赛的主题包括软件应用、微课与教学辅助等11个大类。参赛队由1&#xff5e;3名本科生组成&#xff0c;指导教师不多于2人。在组队和选题方面&#xff0c;强调团结协作和…

Linux——线程概念与线程的创建

目录 一、什么是线程 二、线程的创建 三、重新理解线程 四、进程和线程对比 一、什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部…

车道线中心线生成方法

车道线中心线生成方法 附赠自动驾驶学习资料和量产经验&#xff1a;链接 基于摄像头传感器输出车道线方程&#xff1a; (1) 其中&#xff1a;、、、为车道线方程系数。 1 车道宽度计算 当车辆直行时&#xff0c;车道宽度计算可根据如下公式计算&#xff1a; …

【BlossomRPC】手把手教你写一个RPC协议

文章目录 新的开始什么是RPC?设计一个RPC需要些什么&#xff1f; 新的开始 经常会遇到一些项目&#xff0c;看着看着就发现看不懂文档了&#xff0c;也就是会出现一些跳过讲解的文章&#xff0c;使得自己很难了解某种中间件的开发全貌&#xff0c;所以想着自己先设计一个比较…

编程实现黄金分割法、平分法和不精确一维搜索等最优化算法

解&#xff1a; 1、黄金分割法 思想&#xff1a; 黄金分割法是通过不断缩短搜索区间的长度来寻求一维函数的极小点&#xff0c;这种方法的基本原理是&#xff1a;在搜索区间[a,b]内按如下规则对称地取两点a1和a2 a1a0.382(b-a); a2a0.618(b-a); 黄金分割法的搜索过程是&#x…

代码随想录算法训练营第二十五天| 回溯算法理论基础、LeetCode77.组合

一、216.组合总和III 题目链接/文章讲解/视频讲解&#xff1a; https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 状态&#xff1a;已解决 1.思路 做过77题&#xff08;上篇博客&#xff09;后&#xff0c;这道题也就不难了&#xff0c;无非是多…

数字化转型导师坚鹏:BLM新质生产力发展方法论

BLM新质生产力发展方法论 ——新质生产力发展之知行果合一 课程背景&#xff1a; 很多学员存在以下问题&#xff1a; 不知道如何理解新质生产力&#xff1f; 不清楚如何发展新质生产力&#xff1f; 不知道新质生产力发展案例&#xff1f; 课程特色&#xff1a; 原创…

echarts统计图占满整个容器

原先的统计图表没有占满容器&#xff0c;感觉整个被压缩了 网上查阅相关资料后发现需要设置grid一个配置项&#xff08;有些数值需要根据实际情况进行调整&#xff09; grid:{top:"0px",left:"0px",right:"0px",bottom:"0px"} 对于gr…

用户登录.java

分析&#xff1a; 1&#xff0c;用String来定义两个变量&#xff0c;记录正确的用户名和密码----->直接赋值得来 2&#xff0c;键盘录入用户名和密码------>new开辟空间得来&#xff0c;存的是地址值 他们直接用比较大小,必定不相同&#xff0c;需要用到String里面的方…

沙箱安全机制

Java安全模型的核心就是Java沙箱(sandbox)&#xff0c; 什么是沙箱&#xff1f; 沙箱是一个 限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(JVM) 特定的运行范围中&#xff0c;并且严格限制代码对本地系统资源访问&#xff0c;通过这样的措施来保证 对代码的 有效隔…

QT中的文件操作QFile、QDataStream、QTextStream、QBuffer

文件操作概述 1、Qt中IO操作的处理方式 &#xff08;1&#xff09;、Qt通过统一的接口简化了文件与外部设备的操作方式 &#xff08;2&#xff09;、Qt中的文件被看做是一种特殊的外部设备 &#xff08;3&#xff09;、Qt中的文件操作与外部设备操作相同 2、IO操作中的关键…

基于协同过滤算法的图书推荐系统(ssm+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于协同过滤算法的图书推荐系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能需求…