【转载】Spring MVC @Autowired注入问题

背景
在IDEA升级2017版后,发现以前使用的 @Autowired 出现了个警告 Field injection is not recommended。

@Autowired的不推荐用法
在一个Bean内,可以使用@Autowired注入另一个Bean。

Field 注入(属性注入)

 1 @Service
 2 public class UserService(){
 3 
 4 }
 5 
 6 @Controller
 7 public class UserController(){
 8 
 9     @Autowired
10     private UserService userService;
11 }

事实上,这就是我平常使用的方式,直接在Field上添加注解,简洁又好看。

但这是不推荐的使用方法。

@Autowired的三种使用方式
通过构造器注入
通过setter方法注入
通过field反射注入

 1 public class DI(){
 2 
 3     // 1.通过构造器注入
 4     private DependencyA a;
 5     @Autowired
 6     public DI(DependencyA a){
 7         this.a = a;
 8     }
 9 
10     // 2.通过setter方法注入
11     private DependencyB b;
12     @Autowired
13     public void setDependencyB(DependencyB b){
14         this.b = b;
15     }
16 
17     // 3.通过field反射注入
18     @Autowired
19     private DependencyC c;
20 }

弊端
如果你使用的是构造器注入

恭喜你,当你有十几个甚至更多对象需要注入时,你的构造函数的参数个数可能会长到无法想像。

如果你使用的是field反射注入

如果不使用Spring框架,这个属性只能通过反射注入,太麻烦了!这根本不符合JavaBean规范。

还有,当你不是用过Spring创建的对象时,还可能引起NullPointerException。
并且,你不能用final修饰这个属性。

如果你使用的是setter方法注入

那么你将不能将属性设置为final。

两者取其轻

Spring3.0官方文档建议使用setter注入覆盖构造器注入。
Spring4.0官方文档建议使用构造器注入。
结论
如果注入的属性是必选的属性,则通过构造器注入。
如果注入的属性是可选的属性,则通过setter方法注入。
至于field注入,不建议使用。

原文:https://blog.csdn.net/jeikerxiao/article/details/77161680

posted @ 2018-11-24 19:11  空の彼方  阅读(613)  评论(0编辑  收藏  举报