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
猜你喜欢
- 在gitee上创建springcloud仓库 application.yaml(https方式)server: por
- 比较适合新手。逻辑上仍然有点问题。可以用于学习java文件操作下载地址:http://yun.baidu.com/share/link?sh
- 软引用简介软引用是用来表示某个引用会被GC(垃圾处理器)收集的类。当有引用指向某个obj的时候,通常发生GC的时候不会把这个对象处理掉,但是
- 使用Apache.POI中HSSFWorkbook导出到Excel,具体内容如下所示:1.引入Poi依赖(3.12)依赖如下:<dep
- 1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是乱七八糟的版本号):log4j-core-x
- 一、运行class文件执行带main方法的class文件,命令行为:java <CLASS文件名>注意:CLASS文件名不要带文
- Mybatis typeAlias配置1.定义别名<typeAliases> <ty
- Java集合框架集合概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。集合和数组的区别:数组长度固定,集合长度不固定数
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 前言多数据源的事务处理是个老生常谈的话题,跨两个数据源的事务管理也算是分布式事务的范畴,在同一个JVM里处理多数据源的事务,比较经典的处理方
- substring(参数)是java截取字符串的一个方法。它有两种传参的方式:第一种:public String substring(int
- 今天就来拿贪吃蛇小游戏来练练手吧!贪吃蛇游戏规则: 1.按下空格键(游戏未结束)则游戏
- package cn.liangjintang.httpproxy;import java.io.BufferedReader;import
- 一、使用策略枚举来优化if-else看到网上蛮多人推荐使用策略模式来优化if-else,但我总觉得,搞一堆策略类来优化大批量if-else,
- 前言有人说Gradle使用groovy语言编写,简单,明了没像maven使用xml臃肿,其实我倒不觉得,我觉得maven挺好的,管理jar依
- 现在Java的大部分项目都是基于Maven, 在Maven项目中使用Selenium2. 非常简单。 首先你需要配置好
- 本文实例讲述了Java实现对两个List快速去重并排序操作。分享给大家供大家参考,具体如下:1:去重并排序package twolist;i
- 方法1:import java.net.HttpURLConnection;import java.net.URL;import org.j
- @RequestParam@RequestParam:接收来自RequestHeader中,即请求头。通常用于GET请求,例如:http:/
- Java 静态绑定与动态绑定 最