@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