Bean的初始化顺序

[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();
}
}
---(完)---
Yves wechat
扫一扫互相关注吧~
  • 本文作者: Yves
  • 本文标题: Bean的初始化顺序
  • 发布时间: 2017年10月16日 - 12:10
  • 更新时间: 2020年07月22日 - 00:07
  • 本文链接: /2017/10/16/initialization_order_of_bean/
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

扫一扫关注公众号