当前位置: 首页 > 编程笔记 >

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

施振海
2023-03-14
本文向大家介绍SpringBoot 如何添加容器启动的初始化逻辑的操作方法,包括了SpringBoot 如何添加容器启动的初始化逻辑的操作方法的使用技巧和注意事项,需要的朋友参考一下

背景

传统 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>

方便极了!

到此这篇关于SpringBoot 如何添加容器启动的初始化逻辑的文章就介绍到这了,更多相关SpringBoot 添加容器启动的初始化逻辑内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 目前,我正在使用来自DockerHub的默认RabbitMQ映像启动RabbitMQ Docker容器。使用以下命令。 我需要在第一次启动映像时要提供默认用户/和虚拟主机的位置。例如,创建一个默认的“ test-user”。 目前,我必须通过使用管理插件并通过Web ui添加用户/虚拟主机来手动执行此操作。启动RabbitMQ图像时,有什么方法可以提供默认设置吗? 问题答案: 您可以创

  • 我已经创建了一个有2个INIT容器的作业荚,我的作业成功完成,但没有INIT容器的迹象 对我来说,作业应该在开始之前等待2个init容器的完成 操作系统为Red Hat Enterprise Linux Server 7.3(Maipo) 提前感谢您的帮助。

  • 写构造函数是一个反复的工作。很多开发者总是写了第一个构造器然后复制粘贴代码到另外一个构造器,以满足多个重载函数接口的定义。但愿,你不是其中的一个。如果你是,那么请停止这么做。老练的 C++ 程序员会提取出通用的算法成为一个 private 辅助方法。但是,还是请停止那样做。如果你发现多个构造函数包含相同的逻辑,将这个逻辑提取到一个通用的构造器中。这样做的好处是,你可以避免代码复制,构造器初始化会产

  • 22. 初始化容器 上节课我们学习了容器的健康检查的两个探针:liveness probe(存活探针)和readiness probe(可读性探针)的使用方法,我们说在这两个探针是可以影响容器的生命周期的,包括我们之前提到的容器的两个钩子函数PostStart和PreStop。我们今天要给大家介绍的是Init Container(初始化容器)。 Init Container就是用来做初始化工作的容

  • 问题内容: 偶然发现了这个很棒的文本编辑器,facebook的draft.js。我尝试遵循github中的示例,但我想创建一个具有内容的编辑器,而不是一个空的编辑器。 运行它,但出现错误,提示“未捕获的TypeError:contentState.getBlockMap不是函数” 问题答案: EditorState.createWithContent的第一个参数是,而不是字符串。您需要导入Cont

  • 根据JavaEE 6教程: EJB容器负责确定何时初始化单例会话bean实例,除非单例会话bean实现类用javax注释。ejb。启动注释。在这种情况下,有时称为急切初始化,EJB容器必须在应用程序启动时初始化单例会话bean。在EJB容器向应用程序中的任何企业bean发送客户端请求之前,初始化单例会话bean。 Thorntail提供的RESTEasy应用程序不使用任何EJB,但它使用@Star