[导读]@Autowired注解相信每个Spring开发者都不陌生了!在DD的SpringBoot基础教程(https://blog.didispace.com/spring-boot-learning-2x/)和SpringCloud基础教程(https://blog.didispac...
@Autowired注解相信每个Spring开发者都不陌生了!在DD的Spring Boot基础教程(https://blog.didispace.com/spring-boot-learning-2x/)和Spring Cloud基础教程(https://blog.didispace.com/spring-cloud-learning/)中也都经常会出现。但是当我们使用IDEA写代码的时候,经常会发现@Autowired注解下面是有小黄线的,我们把小鼠标悬停在上面,可以看到这个如下图所示的警告信息:那为什么IDEA会给出Field injection is not recommended这样的警告呢?下面带着这样的问题,一起来全面的了解下Spring中的三种注入方式以及他们之间在各方面的优劣。Spring中的三种依赖注入方式
Field Injection
@Autowired注解的一大使用场景就是Field Injection。具体形式如下:@Controller
public class UserController {
@Autowired
private UserService userService;
}
这种注入方式通过Java的反射机制实现,所以private的成员也可以被注入具体的对象。Constructor Injection
Constructor Injection是构造器注入,是我们日常最为推荐的一种使用方式。具体形式如下:@Controller
public class UserController {
private final UserService userService;
public UserController(UserService userService){
this.userService = userService;
}
}
这种注入方式很直接,通过对象构建的时候建立关系,所以这种方式对对象创建的顺序会有要求,当然Spring会为你搞定这样的先后顺序,除非你出现循环依赖,然后就会抛出异常。Setter Injection
Setter Injection也会用到@Autowired注解,但使用方式与Field Injection有所不同,Field Injection是用在成员变量上,而Setter Injection的时候,是用在成员变量的Setter函数上。具体形式如下:@Controller
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
}
这种注入方式也很好理解,就是通过调用成员变量的set方法来注入想要使用的依赖对象。三种依赖注入的对比
在知道了Spring提供的三种依赖注入方式之后,我们继续回到本文开头说到的问题:IDEA为什么不推荐使用Field Injection呢?我们可以从多个开发测试的考察角度来对比一下它们之间的优劣:可靠性从对象构建过程和使用过程,看对象在各阶段的使用是否可靠来评判:Field Injection:不可靠Constructor Injection:可靠Setter Injection:不可靠
由于构造函数有严格的构建顺序和不可变性,一旦构建就可用,且不会被更改。可维护性主要从更容易阅读、分析依赖关系的角度来评判:Field Injection:差Constructor Injection:好Setter Injection:差
还是由于依赖关键的明确,从构造函数中可以显现的分析出依赖关系,对于我们如何去读懂关系和维护关系更友好。可测试性当在复杂依赖关系的情况下,考察程序是否更容易编写单元测试来评判Field Injection:差Constructor Injection:好Setter Injection:好
Constructor Injection和Setter Injection的方式更容易Mock和注入对象,所以更容易实现单元测试。灵活性主要根据开发实现时候的编码灵活性来判断:Field Injection:很灵活Constructor Injection:不灵活Setter Injection:很灵活
由于Constructor Injection对Bean的依赖关系设计有严格的顺序要求,所以这种注入方式不太灵活。相反Field Injection和Setter Injection就非常灵活,但也因为灵活带来了局面的混乱,也是一把双刃剑。循环关系的检测对于Bean之间是否存在循环依赖关系的检测能力:Field Injection:不检测Constructor Injection:自动检测Setter Injection:不检测
性能表现不同的注入方式,对性能的影响Field Injection:启动快Constructor Injection:启动慢Setter Injection:启动快
主要影响就是启动时间,由于Constructor Injection有严格的顺序要求,所以会拉长启动时间。所以,综合上面各方面的比较,可以获得如下表格:结果一目了然,Constructor Injection在很多方面都是优于其他两种方式的,所以Constructor Injection通常都是首选方案!而Setter Injection比起Field Injection来说,大部分都一样,但因为可测试性更好,所以当你要用@Autowired的时候,推荐使用Setter Injection的方式,这样IDEA也不会给出警告了。同时,也侧面反映了,可测试性的重要地位啊!总结
最后,对于今天的问题讨论,我们给出两个结论,方便大家记忆:- 依赖注入的使用上,
Constructor Injection是首选。 - 使用
@Autowired注解的时候,要使用Setter Injection方式,这样代码更容易编写单元测试。
好了,今天的学习就到这里。记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
SYNCHRONIZE-2研究达到共同主要终点。接受survodutide(索弗度肽)治疗76周后,受试者体重显著下降,降幅最高达13.1%,安慰剂组为3.1%。该研究在减重更具挑战的2型糖尿病人群中开展。[1]...
关键字:
IDE
控制
血糖
TI
上海2026年8月25日 /美通社/ -- 富士胶片控股株式会社荣誉宣布,旗下固定镜头中画幅数码相机"FUJIFILM GFX100RF"在美国工业设计师协会(IDSA)主办的2026年国际设计卓越奖...
关键字:
IDE
富士
数码相机
RF
巴西圣保罗州供水和污水处理公司 SABESP 宣布,将部署全球最大规模的智慧水务管理物联网(IoT)连接项目。该项目由 SABESP 联合 Telefonica/Vivo 与...
关键字:
EMI
IDE
SECURE
物联网
美国市场需求强劲、新产品陆续上市,推动人用药品业务强势增长 集团净销售额达158亿欧元,欧唐静®持续发力,新产品上市表现亮眼 Survodutide(索弗度肽)III期数据结果积极,管线持续突破...
关键字:
管线
TI
GE
IDE
深圳2026年6月2日 /美通社/ -- 全球领先的 AI+机器人药物与材料研发平台企业晶泰科技(2228.HK)今日宣布,依托其 AI 多肽开发平台 PepiX™,公司已成...
关键字:
IDE
泰科
TI
TE
IDE034为B7H3/PTK7双特异性拓扑异构酶I(TOP1)抗体偶联药物(ADC),旨在优先靶向同时表达B7H3与PTK7的肿瘤细胞;目前正评估其单药治疗潜力,并探索与IDEAYA的PARG抑制剂IDE161联...
关键字:
IDE
ADC
TOP
动力学
法国库尔贝瓦2026年2月25日 /美通社/ -- 全球连接与安全解决方案领导者IDEMIA Secure Transactions(IST),现正为全球最大汽车制造商之一H...
关键字:
EMI
GROUP
IDE
MOTOR
DXC宣布与Euronet达成战略合作,扩展全球发卡与支付能力 弗吉尼亚州阿什本2026年1月22日 /美通社/ -- 全球企业技术与创新合作伙伴DXC Technology(NYSE:DXC)今日宣布,其已与领先的全...
关键字:
NET
TECHNOLOGY
SE
IDE
DXC在ISG Provider Lens® AWS生态系统合作伙伴研究中被评为领导者 DXC在ISG的AWS合作伙伴评估中全球斩获16项大奖 弗吉尼亚州阿什本2025年11月6日 /美通社/ -- 全球领先的...
关键字:
AWS
生态系统
AI
IDE
让创新为脑血管疾病治疗带来更多选择 上海2025年11月6日 /美通社/ -- 在第八届中国国际进口博览会期间,强生医疗科技聚焦脑血管疾病治疗领域,携端到端血栓控制产品解决方案及颅内动脉瘤介入治疗新利器正式亮相,其中包...
关键字:
CE
IDE
BSP
人工智能
集成开发环境(IDE)正在经历深刻变革。传统意义上披着“图形界面”外衣的编译器,已不再能满足当今的需求。随着嵌入式系统变得越来越强大,而且AI开始融入几乎所有设计中,开发者需要的是能够理解开发者工作内容的开发环境。新一代...
关键字:
IDE
嵌入式
AI
联动全球物联网创新与本地开发人员需求 盛会获生态伙伴及开发者积极参与
关键字:
AIoT
IDE
物联网
-IDEMIA Secure Transactions携一款革命性、完全自主且节能的解决方案,进军规模达12亿美元的硬件安全模块市场 IDEMIA Secure Trans...
关键字:
EMI
IDE
SECURE
硬件
上海2025年9月30日 /美通社/ -- 富士胶片控股株式会社宣布,在由美国工业设计师协会(IDSA)主办的2025年国际设计卓越奖"IDEA奖"(International Design Exce...
关键字:
IDE
富士
望远镜
ST
随着嵌入式系统开发的复杂度不断提升,开发人员参与的项目随时可以超越Cortex-M系列,这对集成开发环境(IDE)也提出了更高的要求,最好能够用一套IDE来管理、开发和保护日益多样化的工程项目。Keil MDK和IAR...
关键字:
嵌入式系统
IDE
MCU
北京亦庄基本形成具身产业链体系 北京2025年8月8日 /美通社/ -- 天工2.0搭载全球首个通用具身智能平台"慧思开物"从"最能跑"迈向"最好用",全球首...
关键字:
智能机器人
4S店
手术机器人
IDE
北京——2025年7月17日 亚马逊云科技在云计算领域树立了安全、可靠与数据隐私标准。如今,亚马逊云科技将这些原则进一步引入agentic AI领域,发布一系列全新的能力与工具,帮助客户在其坚实的技术基础上构建AI ag...
关键字:
生成式AI
IDE
服务器
北京 2025年7月16日 /美通社/ -- 亚马逊云科技日前宣布推出Kiro预览版,一款专为AI Agent打造的集成开发环境(agentic IDE),通过简化的开发体验,帮助开发者高效实现从概念构想到生产部署的全...
关键字:
IDE
亚马逊
原型设计
TI
在C语言开发领域,工具链的选择直接影响开发效率与代码质量。随着开源生态的成熟,开发者不再局限于商业软件,而是转向功能强大且灵活的开源工具。本文将聚焦两类核心工具——集成开发环境(IDE)与调试器,结合技术特性、应用场景与...
关键字:
C语言
IDE
随着嵌入式系统开发的复杂度不断提升,开发人员参与的项目随时可以超越Cortex-M系列,这对集成开发环境(IDE)也提出了更高的要求,最好能够用一套IDE来管理、开发和保护日益多样化的工程项目。Keil MDK和IAR...
关键字:
嵌入式系统
MCU
IDE