最近面试的时候被问到这个问题,当时自己没回答上来,下来自己想了想然后又查了些博客,所以就记录下这个.
首先写出两个测试类:
@Component
public class TestA {
public TestA() {
System.out.println("TetsA被加载");
}
}
@Component
public class TetsB {
public TetsB(){
System.out.println("TestB被加载");
}
}
没有处理的时候是这样的,为了严谨性,试了很多次,也是这个顺序,现在来改变加载顺序。
特别注意的是@Order并不能改变加载顺序,它的作用不是改变加载顺序而是执行顺序。
1.@DependsOn.
@Component
@DependsOn({"tetsB"})
public class TestA {
public TestA() {
System.out.println("TetsA被加载");
}
}
Depends顾名思义就是依赖的意思,即当要去加载TestA的时候会先去加载TestB的bean,注意小写首字母。看效果:
2.构造器注入
@Component
public class TestA {
public TestA(TetsB tetsB) {
System.out.println("TetsA被加载");
}
}
当spring要初始化A的时候会调用A的构造方法,把B放到A的构造方法发的参数中就能初始化B。看效果:
3.@Configuration+@Bean
public class TestA {
public TestA() {
System.out.println("TetsA被加载");
}
}
____________________________________
@Component
public class TestB {
public TestB(){
System.out.println("TestB被加载");
}
}
____________________________________
@Configuration
public class Config {
@Bean
public TestA getInstanse(TestB b){
return new TestA();
}
}
通过配置类的形式让A注入到容器中,注意A的注解是去掉了,不然会加载两次,一次扫描,一次new,就会这样了.
而B的注解是没有去掉的,因为spring需要去扫描到这个bean.通过这种方式也能控制加载顺序.
先到这吧,这些都是比较常见的方法,也有一些其他用法。spring的bean在初始化的过程中提供一些列的钩子方法,这些的如何用于控制加载顺序,暂时也没思路.