Field injection is not recommended
文章目录
- 1. 引言
- 2. 不推荐使用@Autowired的原因
- 3. Spring提供了三种主要的依赖注入方式
- 3.1. 构造函数注入(Constructor Injection)
- 3.2. Setter方法注入(Setter Injection)
- 3.3. 字段注入(Field Injection)
- 4. 推荐方案
- 5. 参考博客
1. 引言

Field injection is not recommended
意思就是不推荐使用字段注入的方式,不是不推荐@Autowired注解,以前为了简便就直接使用
@Resource代替,程序员都在不断追求完美。。。 接下来我们实实在在的分析一下为啥不推荐,以及到底推荐那种方式注入。
2. 不推荐使用@Autowired的原因
不推荐使用@Autowired进行字段注入的原因有以下几点:
-
紧耦合性(Tight Coupling):字段注入将依赖关系直接注入到类的字段上,导致类与依赖之间产生紧密的耦合。这使得代码难以修改和扩展,并且增加了对具体实现的依赖性。
-
隐藏依赖关系(Hidden Dependencies):字段注入隐藏了类的依赖关系,使代码不够透明和可读。读取代码时无法立即知道类所依赖的其他组件或服务。
-
单元测试困难(Difficult Unit Testing):由于字段注入需要依赖容器来自动注入依赖项,导致在编写单元测试时必须依赖完整的容器环境。这增加了测试的复杂性,并且可能会导致测试变慢或不稳定。
-
难以发现依赖问题(Dependency Issues):字段注入使得依赖可以在运行时更改,这增加了代码维护的复杂性。同时,如果依赖项没有正确配置或不存在,就会在运行时出现错误,而不是在编译时就能发现。
相比之下,构造器注入(Constructor Injection)或Setter方法注入(Setter Injection)提供了更好的可测试性、可维护性和代码清晰度。它们明确列出了类所需的依赖项,并使得依赖关系更加透明和易于理解。这些方法也更容易进行单元测试,且不需要依赖完整的容器环境。
3. Spring提供了三种主要的依赖注入方式
3.1. 构造函数注入(Constructor Injection)
通过构造函数将依赖项传递给目标类。这种方式明确声明了类所需的依赖项,并且使得类的实例在创建时就具备了必要的依赖关系。示例代码如下:
@Component
public class SLFBClient {private final DataSourceFactory dataSourceFactory;/*** @Autowired 从spring4.3开始可以省略*/
// @Autowiredpublic SLFBClient(DataSourceFactory dataSourceFactory) {this.dataSourceFactory = dataSourceFactory;}}
3.2. Setter方法注入(Setter Injection)
通过Setter方法设置依赖项。这种方式允许使用默认构造函数创建类的实例,然后通过Setter方法来动态设置依赖项。示例代码如下:
@Component
public class SLFBClient {private DataSourceFactory dataSourceFactory;/*** @Autowired 从spring4.3开始可以省略*/
// @Autowiredpublic void setDataSourceFactory(DataSourceFactory dataSourceFactory) {this.dataSourceFactory = dataSourceFactory;}
}
3.3. 字段注入(Field Injection)
通过直接将依赖项注入到类的字段上。这种方式最简洁,但也最不推荐使用(在之前的回答中已经详细解释了原因)。示例代码如下:
@Component
public class SLFBClient {// @Autowired
// @Resource@Injectprivate DataSourceFactory dataSourceFactory;}
@Autowired、@Resource和@Inject是用于依赖注入的常见注解,它们在使用方式和一些细节上有一些区别。
-
@Autowired:- 来自
Spring框架。 - 默认按照类型(
byType)进行依赖注入,会尝试将匹配的bean自动注入到目标字段、构造函数或方法参数中。 - 可以与
@Qualifier一起使用,通过指定bean的名称或限定符来进一步指定要注入的bean。 @Autowired是非强制性的,可以在某些情况下将依赖项标记为可选。
- 来自
-
@Resource:- 是
Java EE的标准注解,也可以被Spring框架支持。 - 默认按照名称(
byName)进行依赖注入,通过指定bean的名称来解析并注入匹配的bean。 - 可以使用
name属性指定要注入的bean的名称。 @Resource是强制性的,要求找到匹配的bean进行注入,否则会抛出异常。
- 是
-
@Inject:- 是
Java CDI(Contexts and Dependency Injection)规范的一部分,可以由Java EE和一些其他框架(如Spring)支持。 - 默认按照类型(
byType)进行依赖注入,使用与@Autowired类似的机制。 - 不支持
required属性,即所有注入都被视为必需的。 - 可以与
@Qualifier一起使用,通过指定bean的名称或限定符来进一步指定要注入的bean。
- 是
总结:
@Autowired是Spring特有的注解,默认按类型进行依赖注入。@Resource是Java EE的标准注解,可被Spring支持,默认按名称进行依赖注入。@Inject是Java CDI规范的注解,也可被Spring等框架支持,默认按类型进行依赖注入。- 三个注解都可以与
@Qualifier一起使用来指定具体要注入的bean。 @Autowired和@Inject在功能上相似,而@Resource功能稍有不同,但它们通常可以互相替代使用。
需要注意的是,具体在Spring中使用哪个注解,可以根据项目的需求、框架的支持以及个人偏好来决定。
4. 推荐方案
使用构造器注入的好处:
- 保证依赖不可变(final关键字)
- 保证依赖不为空(省去了我们对其检查)
- 保证返回客户端(调用)的代码的时候是完全初始化的状态
- 避免了循环依赖
- 提升了代码的可复用性
推荐使用Lombok中的@RequiredArgsConstructor注解
@Component
@RequiredArgsConstructor
public class SLFBClient {private final DataSourceFactory dataSourceFactory;}
接下来我们探讨一下Lombok的@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsContructor三个注解
@NoArgsConstructor:- 自动生成一个无参构造函数。
- 适用于不需要传入参数的情况。
import lombok.NoArgsConstructor;@NoArgsConstructor
public class MyClass {// Fields and methods
}
2. @RequiredArgsConstructor:
- 自动生成一个包含所有被标记为final和@NonNull的字段的构造函数。
- 适用于只关注部分字段并确保这些字段非空的情况。
import lombok.NonNull;
import lombok.RequiredArgsConstructor;@RequiredArgsConstructor
public class MyClass {private final String name;@NonNullprivate final Integer age;// Other fields and methods
}
@AllArgsConstructor:- 自动生成一个包含所有类字段的构造函数。
- 适用于需要一次性传递所有字段值的情况。
import lombok.AllArgsConstructor;@AllArgsConstructor
public class MyClass {private String name;private int age;// Other fields and methods
}
5. 参考博客
Field Dependency Injection Considered Harmful
Field injection is not recommended(Spring团队不推荐使用Field注入)
【Spring】浅谈spring为什么推荐使用构造器注入
相关文章:
Field injection is not recommended
文章目录 1. 引言2. 不推荐使用Autowired的原因3. Spring提供了三种主要的依赖注入方式3.1. 构造函数注入(Constructor Injection)3.2. Setter方法注入(Setter Injection)3.3. 字段注入(Field Injection) 4…...
C#字符串占位符替换
using System;namespace myprog {class test{static void Main(string[] args){string str1 string.Format("{0}今年{1}岁,身高{2}cm,月收入{3}元;", "小李", 23, 177, 5000);Console.WriteLine(str1);Console.ReadKey(…...
ChatGPT等人工智能编写文章的内容今后将成为常态
BuzzFeed股价上涨200%可能标志着“转向人工智能”媒体趋势的开始。 周四,一份内部备忘录被华尔街日报透露BuzzFeed正计划使用ChatGPT聊天机器人-风格文本合成技术来自OpenAI,用于创建个性化盘问和将来可能的其他内容。消息传出后,BuzzFeed的…...
【Sklearn】基于梯度提升树算法的数据分类预测(Excel可直接替换数据)
【Sklearn】基于梯度提升树算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 梯度提升树(Gradient Boosting Trees)是一种集成学习方法,用于解决分类和回归问题。它通过将多个弱学习器(通常…...
什么叫做云计算?
相信大多数人对云计算或者是云服务的认识还停留在仅仅听过这个名词,但是对其真正的定义或者意义还不甚了解的层面。甚至有些技术人员,如果日常的业务不涉及到云服务,可能对其也只是一知半解的程度。首先云计算准确的讲只是云服务中的一部分&a…...
深度学习Batch Normalization
批标准化(Batch Normalization,简称BN)是一种用于深度神经网络的技术,它的主要目的是解决深度学习模型训练过程中的内部协变量偏移问题。简单来说,当我们在训练深度神经网络时,每一层的输入分布都可能会随着…...
el-table实现懒加载(el-table-infinite-scroll)
2023.8.15今天我学习了用el-table对大量的数据进行懒加载。 效果如下: 1.首先安装: npm install --save el-table-infinite-scroll2 2.全局引入: import ElTableInfiniteScroll from "el-table-infinite-scroll";// 懒加载 V…...
vueRouter回顾
关于vueRouter的两种路由模式 “history” 模式使用正常的 URL 格式,例如 https://example.com/path。“hash” 模式将路由信息添加到 URL 的哈希部分(#)后面,例如 https://example.com/#/path。 1、history模式:没有…...
大规模无人机集群算法flocking(蜂群)
matlab2016b正常运行...
【第三阶段】kotlin语言的split
const val INFO"kotlin,java,c,c#" fun main() {//list自动类型推断成listList<String>val listINFO.split(",")//直接输出list集合,不解构println("直接输出list的集合元素:$list")//类比c有解构,ktoli…...
机器学习笔记值优化算法(十四)梯度下降法在凸函数上的收敛性
机器学习笔记之优化算法——梯度下降法在凸函数上的收敛性 引言回顾:收敛速度:次线性收敛二次上界引理 梯度下降法在凸函数上的收敛性收敛性定理介绍证明过程 引言 本节将介绍梯度下降法在凸函数上的收敛性。 回顾: 收敛速度:次…...
iphone拷贝照片中间带E自动去重软件,以及java程序如何打包成jar和exe
文章目录 一、前提二、问题描述三、原始处理方式四、程序处理4.1 java程序如何打包exe4.1.1 首先打包jar4.1.2 开始生成exe4.1.3 软件使用方式 4.2 更换图标4.2.1 更换swing的打包jar图标4.2.2 更换exe图标 4.3 如何使生成的exe在没有java环境的电脑上运行4.3.1 Inno Setup打包…...
不同分类器对数据的处理
"""基于鸢尾花的不同分类器的效果比对:step1:准备数据;提取数据的特征向量X,Y将Y数据采用LabelEncoder转化为数值型数据;step2:将提取的特征向量X,Y进行拆分(训练集与测试集)step3:构建不同分类器并设置参数,例如:…...
十面骰子、
十面骰子(一): v 有一个十面的骰子,每一面分别为1-10,不断投掷骰子,投10000次,统计每一面1-10出现的次数或概率. v 提示:可用rand()产生1-10之间的随机数,再统计1-10出现的机会,存放于数组里,…...
IDE的下载和使用
IDE 文章目录 IDEJETBRAIN JETBRAIN 官网下载对应的ide 激活方式 dxm的电脑已经把这个脚本下载下来了,脚本是macjihuo 以后就不用买了...
华为OD机试真题【字母组合】
1、题目描述 【字母组合】 数字0、1、2、3、4、5、6、7、8、9分别关联 a~z 26个英文字母。 0 关联 “a”,”b”,”c” 1 关联 “d”,”e”,”f” 2 关联 “g”,”h”,”i” 3 关联 “j”,”k”,”l” 4 关联 “m”,”n”,”o” 5 关联 “p”,”q”,”r” 6 关联 “s”,”t” 7…...
Midjourney Prompt 提示词速查表 v5.2
Midjourney 最新的版本更新正不断推出令人兴奋的新功能。这虽然不断扩展了我们的AI绘图工具箱,但有时也会让我们难以掌握所有实际可以使用的功能和参数。 针对此问题, 小编整理了 "Midjourney Prompt 提示词速查表",这是一个非常方便的 Midjo…...
自动驾驶——驶向未来的革命性技术
自动驾驶——驶向未来的革命性技术 自动驾驶的组件自动驾驶的优势自动驾驶的应用自动驾驶的未来中国的自动驾驶 自动驾驶是一种技术,它允许车辆在没有人类驾驶员的情况下自主地进行行驶。它利用各种传感器、计算机视觉、人工智能和机器学习算法来感知和理解周围环境…...
PAT (Advanced Level) 甲级 1004 Counting Leaves
点此查看所有题目集 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child. Input Specification: Each input file contains one test case. Each case starts with a line containing 0<N<100, …...
最长递增子序列——力扣300
int lengthOfLIS(vector<int>& nums) {int len=1, n=nums.size();if...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...
