Java变量的初始化顺序为:
- 静态变量或静态语句块
- 实例变量或初始化语句块
- 构造方法
Spring中构造方法执行顺序:- 带@Autowired的有参构造方法
- 不带@Autowired的有参构造方法
- 无参构造方法
- @Autowired
Spring在实例化对象的时候一旦找到一个它认为合适的构造方法,就会直接实例化对象,不会继续寻找其他构造方法。
// 把A对象注入到B中
@Component
public class B {
@Autowired
private A a;
}
@Component
public class A {
}
推荐使用构造方法注入,明确成员变量加载顺序
@Component
public class B {
private final A a;
@Autowired
public B(A a){
this.a = a;
}
}
@Component
public class A {
}
final的解释
spring配置默认的bean的scope是singleton,也就是启动后一直有。通过设置bean的scope属性为prototype来声明该对象为动态创建。但是,如果你的service本身是singleton,注入只执行一次。
@Autowired本身就是单例模式,只会在程序启动时执行一次,即使不定义final也不会初始化第二次,为了防止,在程序运行的时候,又执行了一遍构造函数。
更容易让人理解的意思,加上final只会在程序启动的时候初始化一次,并且在程序运行的时候不会再改变。