SpringBoot 如何添加容器启动的初始化逻辑的操作方法
作者:毕小宝 发布时间:2021-11-20 12:10:39
背景
传统 SpringMVC 项目中,我们可以定义容器初始化 Servlet ,然后在 web.xml 配置该 Servlet ,指定 load-on-startup 就可以在容器启动后,执行一些系统的初始化逻辑。比如设置全局资源文件路径、加载系统定时任务、数据初始化等。
技术转换到 SpringBoot 的时候,该在哪里添加应用初始化的代码呢?
如果初始化逻辑中,有一些普通类,需要通过 Spring 的 ApplicationContext
的 getBean
获取依赖属性,如何保证 Spring 容器已经完成初始化完成、getBean 不会出现空指针呢?
本文将介绍这两个问题。
SpringBoot 启动类和应用 *
首先,SpringBoot 启动类中可以添加应用的初始化逻辑,但是打包方式不同,添加的地方也有差异。
jar 包:使用内嵌 Tomcat 时,可以直接写在 main 函数中,且 SpringApplication.run
代码之前,容器未启动,此时无法获取 getBean
实例。war 包:外部部署时,main 函数中的方法不会被执行,可以在 configure 方法中添加初始化逻辑,此时容器未启动,无法获取 getBean
实例。
其次,就是自定义容器启动 * 类,为其添加 @Componnet
注解:
@Component
public class InitContextListener implements ApplicationListener<ContextRefreshedEvent> {
private static Logger logger = Logger.getLogger(InitContextListener.class);
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
// 设置全局配置信息文件存储路径
String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
logger.info("onApplicationEvent 项目部署路径为:"+path);
VersionManager.resourcePath = path;
// TODO 应用初始化逻辑,容器此时已启动,getBean 获取实例 OK
}
}
IDEA 直接运行
IDEA 中直接运行 SpringBoot 的启动类,它会执行初始化逻辑:
configure
方法不会执行,main
中的初始化逻辑会生效,onApplicationEvent
监听方法也会执行。
war 包发布
打成 war 包后,启动应用,SpringBoot 的启动类的 main
方法不会执行,configure
方法中的初始化逻辑会生效,onApplicationEvent
监听方法也会执行。
1、应用启动之前,先执行 configure 方法:
2、启动之后的,onApplicationEvent
监听方法执行:
jar 包发布
打成 jar 包,跟直接运行 IDEA 的结果一样。
1、应用启动之前,启动类的 main
函数 SpringApplication.run
之前的初始化信息:
2、应用启动之后,启动类的 main 函数 SpringApplication.run
之后的初始化信息,onApplicationEvent
监听事件会执行:
启示录
记住一种就够了,用 ApplicationListener
在容器启动之后,添加应用需要的初始化逻辑,本质上跟定义一个开机启动的 Servlet 一样。
只是用 SpringBoot 之后,一个 @Component
注解,就可以替代 web.xml 中对 Servelt 的配置:
<!-- 配置初始化启动线程 -->
<servlet>
<servlet-name>initServlet</servlet-name>
<servlet-class>
Xxx.InitContexServlet
</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
方便极了!
来源:https://blog.csdn.net/wojiushiwo945you/article/details/108634183


猜你喜欢
- 在客户端中,为了防止界面假死状态,或者不能拖动界面,可以使用BackgroundWorker。1.在界面上拖动一个BackgroundWor
- 前言相信大家在java中用到的最多的时间类莫过于 java.util.Date了,由于Date类中将getYear() , getMonth
- javax.persistence 介绍Spring Data JPA 采用约定大于配置的思想,默认了很多东西JPA是存储业务实体关联的实体
- 本文实例讲述了Android编程设计模式之状态模式。分享给大家供大家参考,具体如下:一、介绍状态模式中的行为是由状态来决定的,不同的状态下有
- 前言由于多核系统普遍存在,并发性编程的应用无疑比以往任何时候都要广泛。但并发性很难正确实现,用户需要借助新工具来使用它。很多基于 JVM 的
- 本文实例为大家分享了java实现PDF转图片的具体代码,供大家参考,具体内容如下1.首先利用maven引入所需jar包<depende
- 1. Java中导致死锁的原因Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得
- IDEA 端口占用解决方法后台开发时经常遇到端口占用问题Intellij IDEA端口占用 解决方法:方法1:打开任务管理器,关闭java
- Spring Aop的原理Spring的AOP就是通过 * 实现的。当为某个Bean或者某些Bean配置切面时,Spring会为其创建代理
- 对于springboot应用,需要以下几个步骤springboot应用开启endpoint,添加actuator的以来和promethus的
- 1.嵌套类如果一个类只对另外一个类有作用,那么可以将其嵌入到该类中,使两个类在一起。和Java中定义的内部类很像。class Compute
- 折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。A 搜素过程从数组的中间元素开始,如果中间元素正好是要查
- android中常常要用到ListView,有时也要用到ExpandableListView,如在手机设置中,对于分类有很好的效果,会用Li
- Java单例模式实现的几种方式单例模式好多书上都是这么写的:public class SingleTon1 {private SingleT
- 定义建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不
- 下面一段内容有项目需求有项目分析,通过一个小demo给大家展示下C#如何对多线程、多任务管理的。项目需求:假设多个任务需要执行,每个任务不是
- Android开发过程中,经常遇到一个项目需要重复的定义相同样式的标题栏,Android相继推出了actionBar, toolBar, 相
- 本文实例讲述了Android编程实现AlertDialog自定义弹出对话框的方法。分享给大家供大家参考,具体如下:弹出对话框,显示自定义的布
- java身份证合法性校验并获取身份证号有效信息,供大家参考,具体内容如下java身份证合法性校验/**身份证前6位【ABCDEF】为行政区划
- Mutex 中文为互斥,Mutex 类叫做互斥锁。它还可用于进程间同步的同步基元。Mutex 跟 lock 相似,但是 Mutex 支持多个