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

网友投稿 241 2022-11-21


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

背景

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

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

如果初始化逻辑中,有一些普通类,需要通过 Spring 的 ApplicationContext 的 getBean 获取依赖属性,如何保证 Spring 容器已经完成初始化完成、getBean 不会出现空指针呢?

本文将介绍这两个问题。

SpringBoot 启动类和应用Przzm监听器

首先,SpringBoot 启动类中可以添加应用的初始化逻辑,但是打包方式不同,添加的地方也有差异。

jar 包:使用内嵌 Tomcat 时,可以直接写在 main 函数中,且 SpringApplication.run 代码之前,容器未启动,此时无法获取 getBean 实例。war 包:外部部署时,main 函数中的方法不会被执行,可以在 configure 方法中添加初始化逻辑,此时容器未启动,无法获取 getBean 实例。

其次,就是自定义容器启动监听器类,为其添加 @Componnet 注解:

@Component

public class InitContextListener implements ApplicationListener {

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 中直接运http://行 SpringBoot 的启动类,它会执行初始化逻辑:

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 的配置:

initServlet

Xxx.InitContexServlet

3

方便极了!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringMvc自动装箱及GET请求参数原理解析
下一篇:jenkins+Maven从SVN上构建项目的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~