当前位置: 首页 > news >正文

Spring Framework中的依赖注入:构造器注入 vs. Setter注入

前言

构造器注入和Setter注入是依赖注入(Dependency Injection,DI)中两种常见的方式,用于向一个对象注入其所依赖的其他对象或数值。这两种注入方式有各自的特点和用途。

构造器注入(Constructor Injection):

在构造器注入中,依赖关系通过类的构造函数传递。这意味着在创建对象时,依赖的对象实例会作为构造函数的参数传递进来。

示例(Java):

public class UserService {private UserRepository userRepository;// 构造器注入public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 其他方法使用userRepository
}

优点:

  1. 对象的依赖关系在创建时就被确定,对象一旦创建就不可变,有助于保持对象的一致性和可靠性。
  2. 在构造函数中明确声明依赖,可以使类的使用更加清晰,减少了后续对依赖的猜测。

Setter注入(Setter Injection):

在Setter注入中,依赖通过类的setter方法进行注入。这意味着你可以在对象创建后随时改变依赖关系。

示例(Java):

public class UserService {private UserRepository userRepository;// Setter注入public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}// 其他方法使用userRepository
}

优点:

  1. 灵活性高,可以在运行时动态更改依赖关系。
  2. 允许逐步构建对象,不需要一次性提供所有依赖。

选择构造器注入还是Setter注入取决于以下因素:

  1. 不变性需求: 如果对象的依赖关系在创建后不应该更改,构造器注入是一个好的选择。
  2. 灵活性需求: 如果对象的依赖关系可能在运行时更改,Setter注入更为合适。
  3. 清晰性: 构造器注入通常更容易理解,因为依赖关系在对象创建时就被确定。
  4. 依赖数量: 如果类有大量的依赖,构造器注入可能更清晰,而不是在构造函数中添加大量的参数。

在实践中,有时也可以使用构造器注入和Setter注入的组合,以满足不同的需求。

当前Spring Framework版本对两者的看法

Spring Framework是一个流行的Java开发框架,它提供了丰富的功能,包括依赖注入(Dependency Injection)的支持。Spring对构造器注入和Setter注入都提供了良好的支持,而且在不同版本中,它并没有显著改变对这两种注入方式的看法。当前版本Spring Framework更推荐通过构造方法注入Bean。

来自“Constructor-based or setter-based DI”

“The Spring team generally advocates constructor injection, as it lets

you implement application components as immutable objects and ensures that required dependencies are not null.

Spring团队通常提倡构造函数注入,因为它允许

将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。

Furthermore, constructor-injected components are always returned to the client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns.

此外,构造器注入的组件总是以完全初始化的状态返回给客户端(调用)代码。顺便说一句,大量的构造函数参数是一种不好的代码气味,这意味着类可能有太多的职责,应该重构以更好地解决适当的关注点分离问题。

Setter injection should primarily only be used for optional dependencies that can be assigned reasonable default values within the class. Otherwise, not-null checks must be performed everywhere the code uses the dependency. One benefit of setter injection is that setter methods make objects of that class amenable to reconfiguration or re-injection later.

Management through JMX MBeans is therefore a compelling use case for setter injection.”

Setter注入应该主要只用于可选的依赖项,这些依赖项可以在类中被分配合理的默认值。否则,必须在代码使用依赖项的任何地方执行非空检查。setter注入的一个好处是,setter方法使该类的对象可以在以后重新配置或重新注入。

因此,通过JMX MBeans进行管理是setter注入的一个引人注目的用例。”

总结

总结以上论点就是:

  • 构造器注入提倡不可变性: 通过构造器注入对象,实现了对象初始化后的不可变性,同时确保所需依赖不为空。这有助于保持对象状态的稳定性。
  • 构造器注入促使代码质量提升: 通过构造器注入,可以清晰地看到类的依赖关系,大量构造器参数说明当前类耦合过多、职责过多,从而促使编码者考虑是否需要重构,以提高代码质量和可维护性。
  • Setter注入适用于可选依赖: Setter注入主要用于可选依赖,这些依赖可以在类内部被合理默认赋值。然而,需要注意的是,Setter注入的对象需要进行非空检查,因为它们具有可变性。
  • Setter注入支持对象的动态重配置: 通过Setter注入,对象可以在运行时进行重新配置或重新注入。这使得Setter注入在JMX MBeans等需要动态管理的场景下变得特别有用。

pexels-jonathan-borba-18894303.jpg

关于我

👋🏻你好,我是Debug.c。微信公众号:种颗代码技术树 的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。

🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。

📞如果您对我感兴趣,请联系我,

⭐️若有收获,就点个赞吧。

⛰若喜欢文中配图,请联系我,我发您原图。

相关文章:

Spring Framework中的依赖注入:构造器注入 vs. Setter注入

前言 构造器注入和Setter注入是依赖注入(Dependency Injection,DI)中两种常见的方式,用于向一个对象注入其所依赖的其他对象或数值。这两种注入方式有各自的特点和用途。 构造器注入(Constructor Injection&#xff…...

Java学习之路 —— API篇

文章目录 前言Object类2. Objects类3. 包装类4. StringBuilder和StringBuffer5. StringJoiner6. Math7. System8. JDK8开始新增的日期、时间9. Arrays10. Lambda表达式11. 方法引用 前言 其实转语言来说,语法都比较简单,花个三天就会了,但最…...

Windows下安装Anaconda5.3.1+Python3.8+TensorFlow2.13.0-CPU版本总结

Python3.8安装可以参考博文https://janus.blog.csdn.net/article/details/55274849 进行安装即可。 【1】Anaconda 清华的开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载,这里选择的是5.3.1版本。 然后正常安装就可以&am…...

DigitalVirt 日本 Lite VPS 测评

发布于 2023-07-18 在 https://chenhaotian.top/vps/digitalvirt-jp-lite/ 官网链接(含AFF):https://digitalvirt.com/aff.php?aff459 日本 软银 CMI,联通首选。 流媒体解锁很好,详见测试。 注意,测速…...

Ridgeline plot / 远山图 / 山脊图 怎么画?怎么优化?

工具 Origin 2022 当然,用Matlab、Python也是可以的。 颜色配置 色卡调整...

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录 一、SysTick定时器 1、SysTick寄存器介绍 (1)控制及状态寄存器 (2)重装载数值寄存器 (3)当前数值寄存器 2、SysTick寄存器配置函数 二、FreeRTOS中的SysTick定时器 1、SysTick配置函数及分析 …...

Vue3封装自定义指令+h()

官方install介绍 directive/myDir/index.js 定义指令 import { h, render, ref } from "vue"; const vMyDir {mounted(el, binding) {renderElement(el, binding);}, }; // inserted是Vue2的生命周期钩子,所以在Vue3项目中要使用mounted const renderEl…...

爆火的迅雷网盘推广,一手云盘app拉新推广渠道必备项目 学习资料

迅雷网盘是目前几个主流网盘拉新推广之一 都可以通过”聚量推客“申请 目前主流的为:夸克网盘拉新、uc网盘推广、迅雷网盘,但是由于阿里的原因 夸克目前不对外开放名额,需要等待,取而代之主流的云盘推广就是迅雷网盘了 聚量推客…...

Jmeter 请求返回多字段 —— 传递登录接口!

Jmeter创建JDBC请求获取登录账密,结果存储到变量中,依次传给登录接口。 1、添加JDBC Request并设置变量,获取数据库多个字段值 ①添加好JDBC Connection Configuration并做好数据库连接配置 ②导入mysql驱动jar包 ③测试计划->添加线程…...

es 7.0常用的命令

es 7.0常用的命令 es 7.0中只有索引和文档(document),没有类型(type)了。 es新建索引: 格式: PUT /索引名称 {"mappings":{"properties":{"字段名称":{"type":"字段类型"}}} }PUT 加索…...

[文件读取]lanproxy 文件读取 (CVE-2021-3019)

1.1漏洞描述 漏洞编号CVE-2021-3019漏洞类型文件读取漏洞等级⭐漏洞环境VULFOCUS攻击方式 描述: Lanproxy 路径遍历漏洞通过../绕过读取任意文件。该漏洞允许目录遍历读取/../conf/config.properties来获取到内部网连接的凭据。 1.2漏洞等级 高危 1.3影响版本 Lanproxy 1.4漏洞…...

记录一种引起 CL.exe/ C++ 编译器无任何提示直接崩溃的问题

只需定义在源文件或公共引入的头文件之中&#xff0c;编译必定CL.exe 退出&#xff0c;错误代码2&#xff0c;它不会产生任何语法意义上的错误提示&#xff0c;感兴趣的可以记录下。 引发崩溃的代码&#xff1a; template <typename T> class IS_CONFIG_LOADER_T_CLASS…...

【华为OD机试高分必刷题目】生理周期(C++-模拟迭代实现)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试高分必刷题目】生理周期(C++-模拟迭代实现)题目描述解题思路java题解代码代码OJ评判结果代码讲解寄语【华为OD机试高分必刷题目…...

【Vue】过滤器Filters

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue系列持续发放&#xff0c;涵盖大量的经验和示例&#xff0c;如对您有用&#xff0c;可以点赞收藏哈 过滤器 filters过滤器已从Vue 3.0中删除&#xff0c;不再支持了&#xff0c;这里可以作为了解进行学习 vue3要精简代码&…...

springcloud旅游网站源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索景区&#xff0c;轮播图&#xff0c;旅游攻略列表 点击攻…...

Unity中关于Lerp()方法的使用

在Unity中&#xff0c;Lerp()方法用于在两个值之间进行线性插值。 它的语法有&#xff1a; public static float Lerp(float a, float b, float t);//在两个float类型的值a和b之间进行线性插值 public static Vector2 Lerp(Vector2 a, Vector2 b, float t);//在两个Vector2类…...

计算机毕业设计选题推荐-体育赛事微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

Android BottomSheetDialog中列表滑动冲突问题

前言 使用BottomSheetDialog弹窗时&#xff0c;里面嵌套了一个纵向的RecyclerView&#xff0c;弹出后加载列表数据&#xff0c;发现弹窗不能滑动&#xff0c;产生了滑动冲突。 一、使用步骤 1.布局示例 代码如下&#xff08;示例&#xff09;&#xff1a; <androidx.appco…...

sql查询查看数据库空间使用情况

SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),990.99) || % "使…...

算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)

算法分析与设计考前冲刺 算法基础 算法是一系列解决问题的清晰指令&#xff0c;代表着用系统的方法描述解决问题的策略机制。 程序是算法用某种程序设计语言的具体的 具体实现 算法特征&#xff1a; 有穷性(有限步) 确定性 输入 输出 可行性(有限时间) 算法的复杂性&#…...

告别重复造轮子:用快马AI一键生成高复用性imToken集成代码模块

告别重复造轮子&#xff1a;用快马AI一键生成高复用性imToken集成代码模块 开发涉及钱包集成的DApp时&#xff0c;最让人头疼的就是那些重复性的基础代码。每次新项目都要重新写一遍连接钱包、处理授权、监听网络切换的逻辑&#xff0c;不仅浪费时间&#xff0c;还容易引入安全…...

【GIS】深入解析地理学中的尺度三重性:Size、Level、Relation的实践应用

1. 尺度三重性&#xff1a;GIS分析的基石 第一次接触"尺度"概念时&#xff0c;我也被各种术语绕晕过——为什么1:10000叫大比例尺却显示小范围&#xff1f;为什么生态学家说的"尺度"和城市规划师说的完全不是一回事&#xff1f;直到把尺度拆解成Size&#…...

从游戏机到影音中心:用wiliwili解锁Switch的隐藏娱乐潜能

从游戏机到影音中心&#xff1a;用wiliwili解锁Switch的隐藏娱乐潜能 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端&#xff0c;目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwil…...

Wan2.2-T2V-A5B常见错误排查:运行失败、生成卡顿的解决方法

Wan2.2-T2V-A5B常见错误排查&#xff1a;运行失败、生成卡顿的解决方法 1. 问题概述与快速诊断 Wan2.2-T2V-A5B作为一款轻量级文本到视频生成模型&#xff0c;虽然在资源消耗和响应速度上具有优势&#xff0c;但在实际使用过程中仍可能遇到运行失败或生成卡顿的问题。这些问题…...

AutoDL部署大模型后,除了Chat:手把手教你用本地API接口玩转文档总结、代码生成和智能客服

AutoDL部署大模型后&#xff0c;除了Chat&#xff1a;手把手教你用本地API接口玩转文档总结、代码生成和智能客服 当你已经在AutoDL上成功部署了大语言模型&#xff0c;并验证了基础的聊天功能后&#xff0c;是否思考过如何将这些能力真正融入日常工作流&#xff1f;本文将带你…...

RMBG-2.0多场景落地指南:短视频素材制作+电商主图抠图完整流程

RMBG-2.0多场景落地指南&#xff1a;短视频素材制作电商主图抠图完整流程 想快速给商品换个背景&#xff0c;又怕抠图不干净&#xff1f;想给短视频做个炫酷的片头&#xff0c;却被复杂的背景处理劝退&#xff1f;今天&#xff0c;咱们就来聊聊一个能让你彻底告别繁琐抠图的神…...

Qwen3-TTS多语言语音合成实测:一键部署,生成10种语言的逼真语音

Qwen3-TTS多语言语音合成实测&#xff1a;一键部署&#xff0c;生成10种语言的逼真语音 1. 开篇&#xff1a;语音合成新体验 想象一下&#xff0c;只需输入一段文字&#xff0c;就能让电脑用10种不同语言"开口说话"&#xff0c;而且声音自然得几乎分辨不出是机器生…...

保姆级教程:在OBBDetection项目中为DOTA数据集定制检测结果可视化(mmdetection 2.2)

深度定制OBBDetection检测结果可视化&#xff1a;DOTA数据集高级实践指南 在旋转目标检测领域&#xff0c;DOTA数据集因其复杂的航拍场景和多角度目标特性&#xff0c;对结果可视化提出了独特挑战。本文将带您从零构建一套完整的可视化解决方案&#xff0c;涵盖从基础配置到高级…...

FunASR Docker部署避坑大全:从SSL证书报错到热词不生效,一次解决所有常见问题

FunASR Docker实战排障指南&#xff1a;从证书配置到热词优化的深度解决方案 当你第一次尝试在Docker环境中部署FunASR语音识别服务时&#xff0c;那些看似简单的命令行参数背后可能藏着无数个"坑"。本文不会重复官方文档的基础操作&#xff0c;而是聚焦于五个最具代…...

英雄联盟自动化助手:提升游戏效率的全方位解决方案

英雄联盟自动化助手&#xff1a;提升游戏效率的全方位解决方案 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari作为一…...