spring bean初始化顺序

转自http://markey.cc/2018/11/04/SpringBoot%E4%B8%AD%E7%9A%84Bean%E5%88%9D%E5%A7%8B%E5%8C%96%E6%96%B9%E6%B3%95%E2%80%94%E2%80%94-PostConstruct/

 

注解说明

  • 使用注解: @PostConstruct
  • 效果:在Bean初始化之后(构造方法和@Autowired之后)执行指定操作。经常用在将构造方法中的动作延迟。
  • 备注:Bean初始化时候的执行顺序: 构造方法 -> @Autowired -> @PostConstruct

引入步骤

在自定义的bean初始化方法上加上@PostConstruct

示例代码

完整参考代码github

注解示例

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class MyPostConstruct {

@PostConstruct
public void init() {
System.out.println("this is init method");
}
}

运行结果:
运行结果

常见问题

在Bean的初始化操作中,有时候会遇到调用其他Bean的时候报空指针错误。这时候就可以将调用另一个Bean的方法这个操作放到@PostConstruct注解的方法中,将其延迟执行。

例如:我们想要在MyPostConstruct方法初始化时调用YourPostConstruct的方法,于是就在MyPostConstruct的构造方法中加入了初始化操作,此时Spring启动会报错。
原因:MyPostConstruct调用YourPostConstruct的方法时,YourPostConstruct这个Bean还没有初始化完成。
解决方案:将初始化操作放到@PostConstruct注解的方法中,这样就能保证在调用方法时Bean已经初始化完成。

错误示例

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyPostConstruct {

@Autowired
YourPostConstruct yourPostConstruct;

public MyPostConstruct() {
yourPostConstruct.sayHello();
}
}
1
2
3
4
5
6
7
8
9
import org.springframework.stereotype.Component;

@Component
public class YourPostConstruct {

public void sayHello() {
System.out.println("hello, i am yourPostConstruct");
}
}

错误示例

正确示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class MyPostConstruct {

@Autowired
YourPostConstruct yourPostConstruct;

@PostConstruct
public void init() {
yourPostConstruct.sayHello();
}

public MyPostConstruct() {
// yourPostConstruct.sayHello();
}
}

正确示例

posted @ 2020-10-09 11:47  Szz  阅读(480)  评论(0编辑  收藏  举报