@Autowired写在构造⽅法上
引⾃:
在编写代码的时候,使⽤@Autowired注解是,发现IDE报的⼀个警告,如下:
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".
翻译:
Spring建议”总是在您的bean中使⽤构造函数建⽴依赖注⼊。总是使⽤断⾔强制依赖”。
这段代码警告原来的写法是:
@Autowired
private EnterpriseDbService service;
建议后写成下⾯的样⼦:
private final EnterpriseDbService service;
@Autowired
public EnterpriseDbController(EnterpriseDbService service) {
this.service = service;
}
奇怪,为何会有这样的建议。
我们知道:@Autowired 可以对成员变量、⽅法以及构造函数进⾏注释。那么对成员变量和构造函数进⾏注释⼜有什么区别呢?
@Autowired注⼊bean,相当于在配置⽂件中配置bean,并且使⽤setter注⼊。⽽对构造函数进⾏注释,就相当于是使⽤构造函数进⾏依赖注⼊了吧。莫⾮是这两种注⼊⽅法的不同。
以下是:@Autowired和构造⽅法执⾏的顺序解析
先看⼀段代码,下⾯的代码能运⾏成功吗?
1 @Autowired
2 private User user;
3 private String school;
4
5 public UserAccountServiceImpl(){
6 this.school = School();
7 }
答案是不能。
因为Java类会先执⾏构造⽅法,然后再给注解了@Autowired 的user注⼊值,所以在执⾏构造⽅法的时候,就会报错。
报错信息可能会像下⾯:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...' defined in file [....class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [...]: Constructor threw exception; nested exception is java.lang.NullPointerException
报错信息说:创建Bean时出错,出错原因是实例化bean失败,因为bean时构造⽅法出错,在构造⽅法⾥抛出了空指针异常。
解决办法是,使⽤构造器注⼊,如下:
1 private User user;
2 private String school;
3
实例化bean的三种方式4 @Autowired
5 public UserAccountServiceImpl(User user){
6 this.user = user;
7 this.school = School();
8 }
可以看出,使⽤构造器注⼊的⽅法,可以明确成员变量的加载顺序。
PS:Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造⽅法–>@Autowired
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论