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

背景

传统 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 的启动类,它会执行初始化逻辑:


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 添加容器启动的初始化逻辑内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot关于容器启动事件总结

    在springboot 容器启动时,我们需要在启动过程中做一些操作,比如启动容器后,执行某些代码. spring 提供了监听器,我们可以方便的实现这些操作. 在容器启动开始时: package com.neo.filter; import org.springframework.boot.context.event.ApplicationStartingEvent; import org.springframework.context.ApplicationListener; public cl

  • springboot实现rabbitmq的队列初始化和绑定

    配置文件,在rabbit中自动建立exchange,queue和绑定它们的关系 代码里初始化exchange 代码里初始化queue 代码里绑定exchange,queue和routekey 配置文件,直接声明vhost 代码里初始化exchange /** * rabbitMq里初始化exchange. * * @return */ @Bean public TopicExchange crmExchange() { return new TopicExchange(EXCHANGE); }

  • 详解SpringBoot程序启动时执行初始化代码

    因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis. 在SpringBoot项目下,即在容器初始化完毕后执行我们自己的初始化代码. 第一步:创建实现ApplicationListener接口的类 package com.stone; import com.stone.service.IPermissionService; import org.springframework.context.ApplicationListener; import

  • springboot 基于Tomcat容器的自启动流程分析

    Springboot 内置了Tomcat的容器,我们今天来说一下Springboot的自启动流程. 一.Spring通过注解导入Bean大体可分为四种方式,我们主要来说以下Import的两种实现方法: 1.通过实现ImportSerlector接口,实现Bean加载: public class TestServiceImpl { public void testImpl() { System.out.println("我是通过importSelector导入进来的service");

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

    背景 传统 SpringMVC 项目中,我们可以定义容器初始化 Servlet ,然后在 web.xml 配置该 Servlet ,指定 load-on-startup 就可以在容器启动后,执行一些系统的初始化逻辑.比如设置全局资源文件路径.加载系统定时任务.数据初始化等. 技术转换到 SpringBoot 的时候,该在哪里添加应用初始化的代码呢? 如果初始化逻辑中,有一些普通类,需要通过 Spring 的 ApplicationContext 的 getBean 获取依赖属性,如何保证 Spr

  • Docker容器启动时初始化Mysql数据库的方法

    1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. 第一种方案是在容器启动后手动导入,太low了不行.第二种在Spring Boot客户端连接Mysql容器时初始化数据库,你可以参考使用flyway进行数据库版本控制一文,但是这依赖客户端的能力.能不能做到Mysql容器启动时就自己初始化数据库呢?当然可以!今天就来演示一下.全部代码见文末. 2.

  • spring容器启动实现初始化某个方法(init)

    spring容器启动 初始化某方法(init) 1.前言 很多时候,我们需要在项目启动的时候,就要完成某些方法的执行.今天整理了一个简单的方法,使用spring容器中bean的属性:init-method 2.代码 /* 初始化的类.这里不需要添加任何注解 */ public class InitData { @Autowired private UserService userService; /* 初始化方法 */ public void inits(){ System.out.printl

  • 详解Spring IOC 容器启动流程分析

    使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要是在 BeanDefinition 的解析上.而对于核心的容器启动流程,仍然是一致的. AbstractApplicationContext 的 refresh 方法实现了 IOC 容器启动的主要逻辑,启动流程中的关键步骤在源码中也可以对应到独立的方法.接下来以  AbstractApplicationContext 的实现类  ClassPathXmlAp

  • springboot使用CommandLineRunner解决项目启动时初始化资源的操作

    前言: 在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等. 今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资源操作. 这个神器就是 CommandLineRunner,CommandLineRunner 接口的 Component 会在所有 Spring Beans 都初始化之后,SpringApplication.run() 之前执行,非常适合在应用程序启动之初进行一些数据初始化的工作. 正文

  • SpringBoot 嵌入式web容器的启动原理详解

    目录 SpringBoot应用启动run方法 SpringApplication.java 中执行的代码 ServletWebServerApplicationContext.java执行的方法 SpringBoot 2.x 版本 嵌入式Servlet容器自动配置原理以及启动原理 一.版本说明 二.总结 三.嵌入式Servlet容器自动配置原理(以Tomcat为例) 四.嵌入式Servlet容器启动原理(以Tomcat为例) SpringBoot应用启动run方法 SpringApplicati

  • springboot 启动时初始化数据库的步骤

    问题描述 在spring-boot启动时,希望能执行相应的sql文件来初始化数据库. 使用配置文件初始化数据库 可以在spring-boot的配置文件application.yml中设置要初始化的sql文件.这是最简单的方法,只需要添加属性就可以实现. 首先设置spring.datasource.initialization-mode=always表示任何类型数据库都进行数据库初始化,默认情况下,spring-boot会自动加载data.sql或data-${platform}.sql文件来初始

  • springboot 项目容器启动后如何自动执行指定方法

    目录 springboot 项目容器启动后自动执行指定 springboot 容器及启动过程 问题1:为什么要启动父子两个容器? 问题2:在什么时候启动父容器? 问题3:父容器和子容器的区别? 问题4:怎么保证父容器启动过程中 问题5:容器实际通过什么来管理bean springboot 项目容器启动后自动执行指定 我们需要写一个class去让它实现ApplicationRunner,然后重写它的run方法就行了,注意类加上@Component注解 注意:这个class需要写在和Applicat

  • SpringBoot启动并初始化执行sql脚本问题

    目录 SpringBoot启动并初始化执行sql脚本 我们先看一下源码 下面我们验证一下这两种方式 SpringBoot项目在启动时执行指定sql文件 1. 启动时执行 2. 执行多个sql文件 3. 不同运行环境执行不同脚本 4. 支持不同数据库 5. 避坑 总结 SpringBoot启动并初始化执行sql脚本 如果我们想在项目启动的时候去执行一些sql脚本该怎么办呢,SpringBoot给我们提供了这个功能,可以在启动SpringBoot的项目时,执行脚本,下面我们来看一下. 我们先看一下源

  • docker容器启动后添加端口映射

    概要 网上有许多人在查找关于容器启动后能否进行端口映射的问题.我曾经也问过度娘,很遗憾我没找到.本文就这个问题给出一个解决方法,旨在抛砖引玉.本文的思路是使用iptables的端口转发,这也是docker端口映射内部的实现机制,只不过我是显示地写出来罢了,为的就是让查找这个问题的人对docker的端口映射有一个直观的了解. 结论:容器启动后是可以添加端口映射的,但不建议手工添加,最好使用docker提供的功能. 步骤 创建两个容器并进行了端口映射,结果如图所示: 假如,我start一个容器,其内

随机推荐