本文介绍了关于“什么是SpringBoot中的Bean初始化方法”的知识。很多人在实际办案过程中都会遇到这样的困难。接下来,让边肖带领大家学习如何应对这些情况!希望大家认真阅读,学点东西!
00-1010使用注释:@PostConstruct
效果:指定的操作在Bean初始化之后执行(在构造函数和@Autowired之后)。它通常用于延迟施工方法中的动作。
注意:Bean初始化的执行顺序:构造函数-@Autowired-@PostConstruct
注解说明
代码示例
@组件
publicclassPostConstructTest1{
@自动连线
post constructtest2postconstructettest2;
public post constructtest1(){ 0
//post constructtest 2 . hello();
}
@PostConstruct
public void init(){ 0
//someinitfunction
}
}在一个Bean的初始化操作中,有时会遇到调用其他Bean时出现空指针的错误。此时,您可以将调用另一个Bean的方法的操作放入由@PostConstruct注释的方法中,并延迟其执行。
注解示例
@组件
publicclassPostConstructTest1{
@自动连线
post constructtest2postconstructettest2;
public post constructtest1(){ 0
post constructtest 2 . hello();
}
} @组件
publicclassPostConstructTest2{
public void hello(){ 0
System.out.println('hello,iamPostConstructTest2 ');
}
}
错误示例
@组件
publicclassPostConstructTest1{
@Autowir
ed
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 初始化完成后处理"); } }
启动应用,初始化部分日志如下:
“SpringBoot中的Bean初始化方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/124800.html