[toc]
一个问题,如何让ClassB在ClassA之前被初始化?
不使用配置类
即使用 @Component、 @Service 等注解的Bean。
1 2 3 4 5 6 7 8 9 10 11 12
| @Component public class ClassA {
public ClassA(){ System.out.println("ClassA construct"); }
@PostConstruct public void initA(){ System.out.println("init ClassA"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| @Component public class ClassB {
public ClassB() { System.out.println("ClassB construct"); }
@PostConstruct public void initB() { System.out.println("init ClassB"); } }
|
ClassB是ClassB的成员变量
即下面这种情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Component public class ClassA {
@Autowired private ClassB classB; public ClassA(){ System.out.println("ClassA construct"); }
@PostConstruct public void initA(){ System.out.println("init ClassA"); } }
|
这种情况比较简单,spring会在构造A的时候初始化B。运行结果如下:
1 2 3 4
| ClassA construct ClassB construct init ClassB init ClassA
|
ClassB不是ClassB的成员变量
当ClassA和ClassB之间不存在依赖关系时,即下面这种情况:
1 2 3 4 5 6 7 8 9 10 11 12
| @Component public class ClassA {
public ClassA(){ System.out.println("ClassA construct"); }
@PostConstruct public void initA(){ System.out.println("init ClassA"); } }
|
使用*@DependsOn* 注解
此时可以使用 @DependsOn 注解:
1 2 3 4 5
| @Component @DependsOn("classB") public class ClassA { //略 }
|
运行结果如下,注意与上面运行结果的区别:
1 2 3 4
| ClassB construct init ClassB ClassA construct init ClassA
|
使用*@Order* 注解
1 2 3 4 5
| @Component @Order(2) public class ClassA { //略 }
|
1 2 3 4 5
| @Component @Order(1) public class ClassB { //略 }
|
但是配置后并未生效,待确认。
使用配置类
可以在 配置类里定义Bean的加载顺序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Configuration public class Config {
@Bean public ClassB classB() { System.out.println("classB bean initialized"); return new ClassB(); }
@Bean public ClassA classA() { System.out.println("classA bean initialized"); return new ClassA(); } }
|