浅谈SpringBoot中的Bean初始化方法 @PostConstruct
作者:Markey92 发布时间:2022-06-11 07:21:17
注解说明
使用注解: @PostConstruct
效果:在Bean初始化之后(构造方法和@Autowired之后)执行指定操作。经常用在将构造方法中的动作延迟。
备注:Bean初始化时候的执行顺序: 构造方法 -> @Autowired -> @PostConstruct
代码示例
注解示例
@Component
public class PostConstructTest1 {
@Autowired
PostConstructTest2 postConstructTest2;
public PostConstructTest1() {
// postConstructTest2.hello();
}
@PostConstruct
public void init() {
// some init function
}
}
在Bean的初始化操作中,有时候会遇到调用其他Bean的时候报空指针错误。这时候就可以将调用另一个Bean的方法这个操作放到@PostConstruct注解的方法中,将其延迟执行。
错误示例
@Component
public class PostConstructTest1 {
@Autowired
PostConstructTest2 postConstructTest2;
public PostConstructTest1() {
postConstructTest2.hello();
}
}
@Component
public class PostConstructTest2 {
public void hello() {
System.out.println("hello, i am PostConstructTest2");
}
}
正确示例
@Component
public class PostConstructTest1 {
@Autowired
PostConstructTest2 postConstructTest2;
public PostConstructTest1() {
postConstructTest2.hello();
}
}
@Component
public class PostConstructTest1 {
@Autowired
PostConstructTest2 postConstructTest2;
public PostConstructTest1() {
// postConstructTest2.hello();
}
@PostConstruct
public void init() {
postConstructTest2.hello();
}
}
SpringBoot @PostConstruct虽好,也要慎用
做过SpringBoot开发的话,肯定对@PostConstruct比较熟悉。在一个Bean组件中,标记了@PostConstruct的方法会在Bean构造完成后自动执行方法的逻辑。
1 问题的产生
先说下SpringBoot中Bean的加载过程,简单点说就是SpringBoot会把标记了Bean相关注解(例如@Component、@Service、@Repository等)的类或接口自动初始化全局的单一实例,如果标记了初始化顺序会按照用户标记的顺序,否则按照默认顺序初始化。在初始化的过程中,执行完一个Bean的构造方法后会执行该Bean的@PostConstruct方法(如果有),然后初始化下一个Bean。
那么: 如果@PostConstruct方法内的逻辑处理时间较长,就会增加SpringBoot应用初始化Bean的时间,进而增加应用启动的时间。因为只有在Bean初始化完成后,SpringBoot应用才会打开端口提供服务,所以在此之前,应用不可访问。
2 案例模拟
为了模拟上面说的情况,在SpringBoot项目中建两个组件类ComponentOne和ComponentTwo。耗时的初始化逻辑放在ComponentOne中,并设置ComponentOne的初始化顺序在ComponentTwo之前。完整代码如下:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ComponentOne {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public ComponentOne() {
this.logger.info("ComponentOne 初始化完成");
}
@PostConstruct
public void init() {
this.logger.info("ComponentOne 模拟耗时逻辑开始");
try {
//这里休眠5秒模拟耗时逻辑
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
logger.info("模拟逻辑耗时失败", e);
}
this.logger.info("ComponentOne 模拟耗时逻辑完成");
}
}
@Component
@Order(Ordered.HIGHEST_PRECEDENCE + 1)
public class ComponentTwo {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public ComponentTwo() {
this.logger.info("ComponentTwo 初始化完成");
}
@PostConstruct
public void init() {
this.logger.info("ComponentTwo 初始化完成后处理");
}
}
启动应用,初始化部分日志如下:
3 总结
所以,如果应用有一些初始化操作,有以下几点建议:
轻量的逻辑可放在Bean的@PostConstruct方法中
耗时长的逻辑如果放在@PostConstruct方法中,可使用独立线程执行
初始化操作放在CommandLineRunner或ApplicationRunner的实现组件中
来源:https://blog.csdn.net/u012578322/article/details/84112451


猜你喜欢
- 有些时候我们需要监听webview的滚动事件,但WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个protected
- 目录一、首先导入生成二维码和微信支付环境二、在application.yml文件配置微信所有需的基本配置1.导入2.创建MyWXPayCon
- 1、Java字符串在 Java 中字符串被作为 String 类型的对象处理。 String 类位于 java.lang 包中,默认情况下该
- Crypto 库是C/C++的加密算法库,这个加密库很流行,基本上涵盖了市面上的各类加密解密算法,以下代码是我在学习是总结的,放到这里用于后
- 最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介
- 目录1. 前言2. 方法1 使用SurfaceView3. 方法2 给拍照下来的图片添加水印第一步:获取拍照权限第二步:拍照调用相机进行拍照
- 前言两个数据结构:顺序表和链表数据结构是一门学科,和语言无关。数据 + 结构:一种描述和组织数据的方式。1. 顺序表顺序表是用一段物理地址连
- 在我们现在开发APP过程中,当用户注册时,短信验证是必不可少的操作,这里我们就是用一个免费的第三方短信验证SDK-MOP首先看下效果图 获取
- 对于步入编程行业不深的初学者或是已经有所领会的人来说,当学习一项新的技术的时候,非常渴望有一个附上注释完整的Demo。本人深有体会,网上的例
- 1,pair的应用pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一
- spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的
- 实现android双击后退键退出当前APP功能实现该功能基本思路是,1, 监听后退键 , 比较两次后退间隔 , 低于两秒则出发退出2, 退出
- 为哪些方法代理?实现自己 * ,首先需要关注的点就是,代理对象需要为哪些方法代理? 原生JDK的 * 的实现是往上抽象出一层接口,让目标
- 开发前准备支付宝开发平台.支付宝沙箱环境申请使用!!!重点 授权回调地址必须要写全路径也就是controller最终路径(下面有具体细节)R
- 基于有了OO的基础后,开始认真学习设计模式!设计模式是java设计中必不可少的!Apple.javapackage strategy;/**
- 前言嗯。最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了。撒花。Java的位运算以及b
- 一、效果实现二、实现思路:1. 正上方的提示区域,用一个类(LockIndicator.java)来实现,自定义view来绘制9个提示图标;
- 相同:1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;2、Linke
- 前言:前两天做项目的时候,想提高一下插入表的性能优化,因为是两张表,先插旧的表,紧接着插新的表,一万多条数据就有点慢了后面就想到
- 看前欣赏美图!上才艺!目录 一.顺序结构二.分支结构1.if语句2.switch 语句 三. 循环结构1 .while 循环2. break