六种方式实现springboot项目启动预加载

更新时间:2023-06-21 02:38:21 阅读: 评论:0

六种⽅式实现springboot项⽬启动预加载
⽬录
前⾔
在实际⼯作中总是需要在项⽬启动时做⼀些初始化的操作,⽐如初始化线程池、提前加载好加密证书…
那么经典问题来了,这也是⾯试官经常会问到的⼀个问题:有哪些⼿段在Spring Boot 项⽬启动的时候做⼀些事情?
⽅法有很多种,下⾯介绍⼏种常见的⽅法。
1、监听容器刷新完成扩展点ApplicationListener<ContextRefreshedEvent>
ApplicationContext事件机制是观察者设计模式实现的,通过ApplicationEvent和ApplicationListener这两个接⼝实现ApplicationContext的事件机制。
Spring中⼀些内置的事件如下:
1. ContextRefreshedEvent:ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 Config
urableApplicationContext接
⼝中使⽤ refresh() ⽅法来发⽣。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可⽤。
2. ContextStartedEvent:当使⽤ ConfigurableApplicationContext (ApplicationContext⼦接⼝)接⼝中的 start() ⽅法启动
ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停⽌的应⽤程序。
3. ContextStoppedEvent:当使⽤ ConfigurableApplicationContext 接⼝中的 stop() 停⽌ ApplicationContext 时,发布这个事件。
你可以在接受到这个事件后做必要的清理的⼯作。
4. ContextClodEvent:当使⽤ ConfigurableApplicationContext 接⼝中的 clo() ⽅法关闭 ApplicationContext 时,该事件被发
布。⼀个已关闭的上下⽂到达⽣命周期末端;它不能被刷新或重启。
5. RequestHandledEvent:这是⼀个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。只能应⽤于使⽤DispatcherServlet
的Web应⽤。在使⽤Spring作为前端的MVC控制器时,当Spring处理⽤户请求结束后,系统会⾃动触发该事件。
好了,了解上⾯这些内置事件后,我们可以监听ContextRefreshedEvent在Spring Boot 启动时完成⼀些操作,代码如下:
@Component
public class TestApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
System.out.println(contextRefreshedEvent);
System.out.println("");
}
}
⾼级玩法
可以⾃定事件完成⼀些特定的需求,⽐如:邮件发送成功之后,做⼀些业务处理。
安徒生作者简介
1. ⾃定义EmailEvent,代码如下:
public class EmailEvent extends ApplicationEvent{
private String address;
private String text;
public EmailEvent(Object source, String address, String text){
super(source);
this.address = address;
< = text;
}
public EmailEvent(Object source) {
super(source);
}
//......address和text的tter、getter
}
1. ⾃定义监听器,代码如下:
public class EmailNotifier implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof EmailEvent) {羽毛球英语怎么说
EmailEvent emailEvent = (EmailEvent)event;
System.out.println("邮件地址:" + Address());
怎样科学育儿System.our.println("邮件内容:" + Text());
} el {
System.our.println("容器本⾝事件:" + event);
}
}
}
1. 发送邮件后,触发事件,代码如下:
public class SpringTest {
public static void main(String args[]){
ApplicationContext context = new ClassPathXmlApplicationContext("l");
//创建⼀个ApplicationEvent对象
EmailEvent event = new EmailEvent("hello","","This is a test");
//主动触发该事件
context.publishEvent(event);
}
}
2、SpringBoot的CommandLineRunner接⼝
当容器初始化完成之后会调⽤CommandLineRunner中的run()⽅法,同样能够达到容器启动之后完成⼀些事情。这种⽅式和ApplicationListener相⽐更加灵活,如下:刺客无名
不同的CommandLineRunner实现可以通过@Order()指定执⾏顺序
可以接收从控制台输⼊的参数。
下⾯⾃定义⼀个实现类,代码如下:
@Component
@Slf4j
public class CustomCommandLineRunner implements CommandLineRunner {
/**
* @param args 接收控制台传⼊的参数
*/
分类垃圾手抄报
@Override
public void args) throws Exception {
log.debug("从控制台接收参数>>>>"+ Arrays.asList(args));
}
}
运⾏这个jar,命令如下:
java -jar demo.jar aaa bbb ccc
人人都说江南好
以上命令中传⼊了三个参数,分别是aaa、bbb、ccc,这三个参数将会被run()⽅法接收到。如下图:
源码分析
谈判的艺术
读过我的⽂章的铁粉都应该知道CommandLineRunner是如何执⾏的,原⽂:
Spring Boot 加载上下⽂的⼊⼝在t.ConfigurableApplicationContext()这个⽅法中,如下图:
调⽤CommandLineRunner在callRunners(context, applicationArguments);这个⽅法中执⾏,源码如下图:
3、SpringBoot的ApplicationRunner接⼝
ApplicationRunner和CommandLineRunner都是Spring Boot 提供的,相对于CommandLineRunner来说对于控制台传⼊的参数封装更好⼀些,可以通过键值对来获取指定的参数,⽐如--version=2.1.0。
此时运⾏这个jar命令如下:
java -jar demo.jar --version=2.1.0 aaa bbb ccc
以上命令传⼊了四个参数,⼀个键值对version=2.1.0,另外三个是分别是aaa、bbb、ccc。
同样可以通过@Order()指定优先级,如下代码:
@Component
@Slf4j
public class CustomApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
log.debug("控制台接收的参数:{},{},{}",OptionNames(),NonOptionArgs(),SourceArgs());
}
}
通过以上命令运⾏,结果如下图:
源码分析
和CommandLineRunner⼀样,同样在callRunners()这个⽅法中执⾏,源码如下图:
4、@PostConstruct注解
前三种针对的是容器的初始化完成之后做的⼀些事情,@PostConstruct这个注解是针对Bean的初始化完成之后做⼀些事情,⽐如注册⼀些监听器…
@PostConstruct注解⼀般放在Bean的⽅法上,⼀旦Bean初始化完成之后,将会调⽤这个⽅法,代码如下:
@Component
@Slf4j
public class SimpleExampleBean {
@PostConstruct
public void init(){
log.debug("Bean初始化完成,调⽤...........");
}
}
治疗咳嗽的中药5、@Bean注解中指定初始化⽅法

本文发布于:2023-06-21 02:38:21,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1002799.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:事件   容器   完成   参数   启动   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图