当前位置: 首页 > 后端技术 > Java

为什么IDEA不推荐你使用@Autowired?

时间:2023-04-01 18:49:43 Java

@Autowired注解相信每个Spring开发者都不陌生吧!在DD的SpringBoot基础教程和SpringCloud基础教程中也经常出现。但是我们在使用IDEA写代码的时候,经常会发现@Autowired注解下面有一条黄色的小线。当我们将鼠标悬停在上面时,可以看到如下图所示的警告信息:SowhydoesIDEAgiveWhataboutwarningslikeFieldinjectionisnotrecommended?下面带着这样的问题,让我们对Spring中的三种注入方式以及它们在各个方面的优缺点有一个全面的了解。SpringFieldInjection@Autowired注解中的三种依赖注入方式之一,是FieldInjection的主要使用场景。具体形式如下:@ControllerpublicclassUserController{@AutowiredprivateUserServiceuserService;}这种注入方式是通过Java的反射机制实现的,所以私有成员也可以注入到具体的对象中。ConstructorInjectionConstructorInjection即构造函数注入,是我们日常生活中最推荐的一种使用方式。具体形式如下:@ControllerpublicclassUserController{privatefinalUserServiceuserService;publicUserController(UserServiceuserService){this.userService=userService;}}这种注入方式很直接,在构造对象的时候就建立了关系,所以这种方式对于对象的创建顺序会有要求。当然,Spring会帮你处理这个顺序,除非你有循环依赖,然后就会抛出异常。SetterInjectionSetterInjection也使用了@Autowired注解,但是和FieldInjection的使用方式不同。FieldInjection用在成员变量上,而SetterInjection用在成员变量的Setter函数上。具体形式如下:@ControllerpublicclassUserController{privateUserServiceuserService;@AutowiredpublicvoidsetUserService(UserServiceuserService){this.userService=userService;}}这种注入方式也很容易理解,就是通过调用成员变量的set方法来注入要使用的依赖对象。三种依赖注入的比较了解了Spring提供的三种依赖注入方式后,我们继续回到本文开头提到的问题:为什么IDEA不推荐使用FieldInjection?我们可以从多次开发测试的角度来比较它们的优缺点:可靠性是从对象构造过程和使用过程,以及对象在每个阶段是否可靠来判断的:FieldInjection:UnreliableConstructorInjection:ReliableSetterInjection:UnreliableSinceconstructor具有严格的构造顺序和不可变性,构造后可用,不可更改。可维护性主要从易读性和依赖分析的角度来判断:FieldInjection:PoorConstructorInjection:GoodSetterInjection:Poor或者是因为依赖key很明确,从constructor可以清楚的分析出依赖关系。对于我们如何更友好地理解关系和维护关系。Testability在复杂依赖的情况下,检查程序是否更容易编写单元测试来判断FieldInjection:PoorConstructorInjection:GoodSetterInjection:GoodConstructorInjection和SetterInjection更容易Mock和注入对象,所以更容易Easy实施单元测试。灵活性主要通过开发实现时的编码灵活性来判断:FieldInjection:非常灵活ConstructorInjection:不灵活SetterInjection:非常灵活由于ConstructorInjection对Bean依赖设计有严格的顺序要求,所以这种注入方式不太灵活。相反,FieldInjection和SetterInjection非常灵活,但是因为灵活,也带来了局面的混乱,这也是一把双刃剑。循环关系检测能够检测bean之间是否存在循环依赖:FieldInjection:无检测ConstructorInjection:AutomaticSetterInjection:无性能检测注入方式不同,对性能的影响FieldInjection:启动快ConstructorInjection:启动慢SetterInjection:快速启动的主要影响是启动时间。由于ConstructorInjection有严格的顺序要求,会加长启动时间。因此,基于以上几个方面的对比,可以得到下表:结果一目了然,ConstructorInjection在很多方面都优于其他两种方式,所以ConstructorInjection通常是首选方案!SetterInjection和FieldInjection相比,大同小异,但是因为更好的可测试性,当你想使用@Autowired时,推荐使用SetterInjection,这样IDEA不会给出警告。同时也体现了可测试性的重要地位!总结最后,对于今天的讨论,我们给出两个结论,让大家记住:ConstructorInjection是使用依赖注入的首选。在使用@Autowired注解时,使用SetterInjection方法,这样代码更容易编写单元测试。好了,今天的学习就到这里!如果你在学习过程中遇到困难?可以加入我们超优质的Spring技术交流群,参与交流讨论,更好的学习进步!原创不易,欢迎转发分享本文内容,您的支持是我前进的动力!欢迎关注我的公众号:程序员DD,分享别处看不到的知识和思考