当前位置:首页 > 单片机 > 程序员小灰
[导读]@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也不会给出警告了。同时,也侧面反映了,可测试性的重要地位啊!

总结

最后,对于今天的问题讨论,我们给出两个结论,方便大家记忆:

  1. 依赖注入的使用上,Constructor Injection是首选。
  2. 使用@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 人工智能
关闭