Bootstrap

@Autowired 对构造函数使用

Java变量的初始化顺序为:

  1. 静态变量或静态语句块
  2. 实例变量或初始化语句块
  3. 构造方法
    Spring中构造方法执行顺序:
    1. 带@Autowired的有参构造方法
    2. 不带@Autowired的有参构造方法
    3. 无参构造方法
  4. @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只会在程序启动的时候初始化一次,并且在程序运行的时候不会再改变。

;