用了@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注入,竟然被警告

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

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


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

查看所有标签

猜你喜欢:

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

Beginning iPhone and iPad Web Apps

Beginning iPhone and iPad Web Apps

Chris Apers、Daniel Paterson / Apress / 2010-12-15 / USD 39.99

It seems that everyone and her sister has developed an iPhone App—everyone except you, the hard-working web professional. And now with the introduction of the iPad, you may even feel farther behind. B......一起来看看 《Beginning iPhone and iPad Web Apps》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

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

html转js在线工具