Bean的初始化顺序

文章目录
  1. 1. 不使用配置类
    1. 1.1. ClassB是ClassB的成员变量
    2. 1.2. ClassB不是ClassB的成员变量
      1. 1.2.1. 使用*@DependsOn* 注解
      2. 1.2.2. 使用*@Order* 注解
  2. 2. 使用配置类

[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();
}
}