Java
参考http://blog.youkuaiyun.com/u011080472/article/details/51330114,可以看到java的初始化顺序为:
(同一级别应该按照声明顺序构造,尚未验证)
1.父类静态代码区和父类静态成员
2.子类静态代码区和子类静态成员
3.父类非静态代码区和普通成员
4.父类构造函数
5.子类非静态代码区和普通成员
6.子类构造函数
spring
加载bean的顺序
当使用spring的时候,使用autowired加载bean时,下列代码中的error 1处会报错。首先在applicationContext定义的地方开始构造各种bean,然后再进行各种注入。我理解构造顺序如下,符合java构造顺序:
1.静态构造(此处没有)
2.成员变量初始化,此时由于没有赋值,所以将setter,getter初始化为NULL,注意,此时没有注入
3.执行构造函数
4.autowired注入
@Controller
public class Main {
@Autowired
private Setter setter;
@Autowired
private Getter getter;
int testNum = 123;
public Main() {
System.out.println("before testNum = " + testNum);
testNum = 3;
System.out.println("after testNum = " + testNum);
System.out.println("getter data = " + getter.getData());//error 1
}
public void start() {
}
public static void main(String[] args) {
System.out.println("main start");
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(test.thread.config.MainConfig.class);
Main main = applicationContext.getBean(Main.class);
main.start();
}
}
正是因为这种构造顺序,所以error 1这里会报错,因此在使用spring是,如果使用autowired注解,应该用在构造函数处,这样就不会报错了。例如:
@Autowired
public Main(Getter inputGetter) {
this.getter = inputGetter;
System.out.println("before testNum = " + testNum);
testNum = 3;
System.out.println("after testNum = " + testNum);
System.out.println("getter data = " + getter.getData());
}