SpringBoot 如何添加容器启动的初始化逻辑的操作方法

作者:毕小宝 时间:2021-11-20 12:10:39 

背景

传统 SpringMVC 项目中,我们可以定义容器初始化 Servlet ,然后在 web.xml 配置该 Servlet ,指定 load-on-startup 就可以在容器启动后,执行一些系统的初始化逻辑。比如设置全局资源文件路径、加载系统定时任务、数据初始化等。

技术转换到 SpringBoot 的时候,该在哪里添加应用初始化的代码呢?

如果初始化逻辑中,有一些普通类,需要通过 Spring 的 ApplicationContextgetBean 获取依赖属性,如何保证 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 的启动类,它会执行初始化逻辑:

SpringBoot 如何添加容器启动的初始化逻辑的操作方法
configure方法不会执行,main 中的初始化逻辑会生效,onApplicationEvent 监听方法也会执行。

war 包发布

打成 war 包后,启动应用,SpringBoot 的启动类的 main 方法不会执行,configure 方法中的初始化逻辑会生效,onApplicationEvent 监听方法也会执行。

1、应用启动之前,先执行 configure 方法:

SpringBoot 如何添加容器启动的初始化逻辑的操作方法

2、启动之后的,onApplicationEvent 监听方法执行:

SpringBoot 如何添加容器启动的初始化逻辑的操作方法

jar 包发布

打成 jar 包,跟直接运行 IDEA 的结果一样。

1、应用启动之前,启动类的 main 函数 SpringApplication.run 之前的初始化信息:

SpringBoot 如何添加容器启动的初始化逻辑的操作方法

2、应用启动之后,启动类的 main 函数 SpringApplication.run 之后的初始化信息,onApplicationEvent 监听事件会执行:

SpringBoot 如何添加容器启动的初始化逻辑的操作方法

启示录

记住一种就够了,用 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

标签:SpringBoot,容器启动,初始化
0
投稿

猜你喜欢

  • 浅谈RecyclerView(完美替代ListView,GridView)

    2022-12-08 06:54:20
  • 线程池中使用spring aop事务增强

    2021-08-06 06:37:19
  • Struts2拦截器 关于解决登录的问题

    2023-07-02 14:06:09
  • eclipse springboot工程打war包方法及再Tomcat中运行的方法

    2023-04-14 09:21:40
  • Java Map简介_动力节点Java学院整理

    2023-06-03 20:27:03
  • 关于Java中@SuppressWarnings的正确使用方法

    2023-07-22 17:17:58
  • C#获取计算机硬件与操作系统的相关信息

    2022-12-12 07:11:36
  • Android自定义控件绘制基本图形基础入门

    2023-06-23 07:19:04
  • C#双向链表LinkedList排序实现方法

    2021-08-19 14:06:16
  • C#图像亮度调式与伪彩色图的处理教程(推荐)

    2022-03-26 19:43:54
  • 详解C# 虚方法virtual

    2022-11-05 09:41:17
  • springboot启动扫描不到dao层接口的解决方案

    2021-06-29 19:56:06
  • c#模拟js escape方法的简单实例

    2023-01-26 07:29:24
  • 详解Java的MyBatis框架和Spring框架的整合运用

    2022-09-19 19:22:20
  • java异步上传图片示例

    2023-05-31 13:42:51
  • spring boot 图片上传与显示功能实例详解

    2021-07-02 09:46:02
  • C++继承详细介绍

    2022-08-18 10:05:42
  • 移动开发Spring Boot外置tomcat教程及解决方法

    2023-08-25 11:47:33
  • c#使用listbox的详细方法和常见问题解决

    2023-08-27 11:28:56
  • 自己动手实现mybatis动态sql的方法

    2023-03-07 16:14:12
  • asp之家 软件编程 m.aspxhome.com