用了@Autowired注入,竟然被警告

栏目: IT技术 · 发布时间: 4年前

01

问题背景

用了@Autowired注入,竟然被警告

最近,在使用idea开发时业务系统时,发现idea上使用了@Autowired,发现竟然被警告了!提示:Field injection is not recommended,警告如下图:

用了@Autowired注入,竟然被警告

what?Field injection is not recommended. (不推荐使用属性注入)

这不是常规操作吗?我们在开发的时候经常使用@Autowired将Bean注入到容器里,已经是非常正规的操作了,凭什么警告我呢?

用了@Autowired注入,竟然被警告

02

原来如此

这里我们先了解下依赖注入的几种方式:构造器注入、setter注入、属性注入。

1)构造方法注入

为了强制依赖,或者为了易变性,使用构造方法注入。

private final DependencyA dependencyA;

@Autowired

public Controller(DependencyA dependencyA){

this.dependencyA = dependencyA;

}

2)setter方法注入

为了可选的或者可变的依赖,使用setter注入。

private DependencyA dependencyA;

@Autowired

public void setDependencyA(DependencyA dependencyA){

this.dependencyA = dependencyA;

}

3)属性Field注入

通过反射直接注入到fields。

@Autowired

private DependencyA dependencyA;

为什么我们经常使用属性field进行注入呢?

其很明显的 好处

变量方式注入非常简洁,直接在属性上增加注解即可,没有任何多余代码,非常有效的提高了 java 的简洁性。即使再多几个依赖一样能解决掉这个问题。

为什么不推荐使用属性Field进行注入呢?

有其 坏处

①不能使用属性注入的方式构建不可变对象;

②类和依赖容器强耦合,不能在容器外使用;

③类不能绕过反射(例如单元测试的时候)进行实例化,必须通过依赖容器才能实例化;

④实际的依赖被隐藏在外面,不是在构造方法或者其它方法里面反射的;

但是,假设一个类经常会有超过10个的依赖。如果使用构造方法的方式注入的话,构造方法会有10个参数,明显不优雅甚至很不科学。如

果使用属性注入的话就没有这样的限制。但是一个类有很多的依赖,是一个危险的标志,因为很有可能这个类完成了超过一件事,违背了 单一职责原则

所以,idea也建议我们尽量使用构造器的方式注入:

用了@Autowired注入,竟然被警告

03

扩展

@Autowired、@Inject、@Resource三者区别

在我们开发spring相关的应用系统时,使用 @Autowired、@Resource作为Bean的注入,是比较常见的。@Inject这个注解我是比较晚(毕竟比@Resource 对应的规范出来的晚,JSR330>JSR250嘻嘻)才使用到的。

那么@Autowired、@Inject、@Resource这三个注解你知道有什么区别吗?

(也可能会在面试中出现哦)

区别:

1)@Autowired是spring自带的注解,@Resource是JSR250规范实现的,@Inject是JSR330规范实现的,需要导入不同的包;

2)@Resource如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

3)@Autowired、@Inject用法基本一样,不同的是@Autowired有一个request属性;

4)@Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用;

5)@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的。

04

总结

1)使用Field注入有其坏处:不能注入不可变对象;类和依赖容器强耦合;不能绕过反射进行实例化注入等。

2)依赖注入一般有三种方式:构造器注入、setter方法注入、属性field注入。

3)区分 @Autowired、@Inject、@Resource之间的不同:@Autowired与@Inject类似,不过一个spring、一个是JSR330规范。@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的等。

4)可以结合实际的使用情况和使用Field注入的缺点进行权衡是否不使用此种方式。虽然说属性Field注入不被推荐,但是我们在日常开发中也会去使用,毕竟可以让代码简洁和提高开发效率。

PS:看到idea出现波浪线,时常会让有强迫症的 码农 难受,如果你不想看到,可以在idea设置将其去除:选择File--Settings--Inspections,然后在右侧搜索 spring Core,Autowiring for bean class【去掉自动装配依赖对象的红线警告】 和 Field injection warning【去掉黄色背景】后面的√即可。

参考资料:

https://www.cnblogs.com/pjfmeng/p/7551340.html

https://www.jianshu.com/p/7f20176f2a40

https://www.jianshu.com/p/36db3e167958

https://blog.csdn.net/zhangjingao/article/details/81094529

https://www.4spaces.org/field-injection-is-not-recommended-solution/

回复公众号【 资料 】获得干货资料集锦:技术ppt、IT大会资料、架构、分布式资料等。

推荐好文

1、 互联网Code Review最佳实践分享

2、 dubbo面试题!会这些,说明你看懂了dubbo源码

6、 必备瑞士军刀IDEA插件,你使用了哪些

7、 线上热更新代码只需3步 Arthas实战

8、 Eureka源码剖析之七:架构&面试题【总结】

9、 互联网工程师应该用这种姿势打印日志

10、 加入:互联网基础/架构交流群

用了@Autowired注入,竟然被警告

-关注搬运工来架构,与优秀的你一同进步-

原创不易,如果喜欢这篇文章可以点在看哦↘


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Non-Obvious

Non-Obvious

Rohit Bhargava / Ideapress Publishing / 2015-3-29 / USD 24.95

What do Disney, Bollywood, and The Batkid teach us about how to create celebrity experiences for our audiences? How can a vending-machine inspire world peace? Can being imperfect make your business mo......一起来看看 《Non-Obvious》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具