【转载】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