springboot2 - 生命周期中的几个事件
springboot 从启动到停止过程中的一些事件(横向切面)
系统事件触发顺序如下,可以在系统启动的不同阶段,植入我们的代码。
- ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent
- ApplicationPreparedEvent
- -> create Object 创建对象
- -> Object init 对象初始化
- ApplicationStartedEvent
- ApplicationReadyEvent
- ApplicationFailedEvent
- ContextClosedEvent(容器关闭时)
- ContextRefreshedEvent(容器刷新时)
- ContextStartedEvent(容器启动时候)
- ContextStoppedEvent(容器停止的时候)
事件简介
1、ApplicationStartingEvent:springboot启动开始的时候执行的事件,在该事件中可以获取到SpringApplication对象,可做一些执行前的设置。
2、ApplicationEnvironmentPreparedEvent:spring boot 对应Enviroment已经准备完毕,但此时上下文context还没有创建。在该监听中获取到ConfigurableEnvironment后可以对配置信息做操作,例如:修改默认的配置信息,增加额外的配置信息等等。
3、ApplicationPreparedEvent:SpringBoot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。在获取完上下文后,可以将上下文传递出去做一些额外的操作。
4、创建对象
5、初始化对象
6、ApplicationStartedEvent:在刷新上下文之后但在调用任何应用程序和命令行运行程序之前发送ApplicationStartedEvent。在调用任何应用程序和命令行运行程序之后发送ApplicationReadyEvent。 它表明该应用程序已准备好处理请求
7、ApplicationReadyEvent:springboot 加载完成时候执行的事件
8、ApplicationFailedEvent:spring boot启动异常时执行事件,在异常发生时,最好是添加虚拟机对应的钩子进行资源的回收与释放,能友善的处理异常信息
上下文事件
功能很像 spring 中的容器后置处理器,在 springboot 命名为上下文事件:
1、ContextClosedEvent(容器关闭时)
2、ContextRefreshedEvent(容器刷新时)
3、ContextStartedEvent(容器启动时候)
4、ContextStoppedEvent(容器停止的时候)
代码案例
代码写法基本一致,需要侦听不同的事件,修改泛型即可
package cn.seaboot.plugin.config;
import cn.seaboot.common.eventbus.EventBus;
import cn.seaboot.common.file.FreeMarkers;
import cn.seaboot.common.quartz.QuartzUtils;
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationListener;
/**
* 应用启动侦听
* ApplicationStartingEvent
* ApplicationEnvironmentPreparedEvent
* ApplicationPreparedEvent
* -> create Object
* -> Object init
* ApplicationStartedEvent
* ApplicationReadyEvent
* ApplicationFailedEvent
*
* ContextClosedEvent(容器关闭时)
* ContextRefreshedEvent(容器刷新时)
* ContextStartedEvent(容器启动时候)
* ContextStoppedEvent(容器停止的时候)
*
* @author ChenSS on 2017年8月21日
*/
public class ApplicationPreparedListener implements ApplicationListener<ApplicationPreparedEvent> {
@Override
public void onApplicationEvent(ApplicationPreparedEvent applicationStartedEvent) {
EventBus.init();
QuartzUtils.init();
FreeMarkers.defaultConfiguration();
}
}
// 直接在 main 函数中添加这些侦听。
/**
* Application starter
* @author Mr.css
* @date 2019/12/10
*/
@EnableCaching
@SpringBootApplication
@MapperScan("cn.seaboot.admin.dao")
public class AdminApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(AdminApplication.class);
springApplication.addListeners(new ApplicationPreparedListener());
springApplication.addListeners(new ApplicationStartedListener());
springApplication.addListeners(new ContextClosedListener());
springApplication.run(args);
}
}
Spring 通用的一些接口
- InitializingBean(在所有的Bean互相注入和Properties参数设置之后,调用init之前)
- DisposableBean(调用Bean的destory之前)
- BeanPostProcessor :可以在Bean创建之后,在初始化之前、初始化之后,进行一些额外的操作。
- BeanFactoryPostProcessor :在所有的Bean初始化之前,进行一些额外的操作,例如:手动注册对象到Spring容器。