简述:我们经常会在写代码时,会通过spring或者springBoot的各个节点做一些操作,比如对某一个对象实例做初始化操作或者做扩展。那么我们来梳理一下spring和springBoot中提供了哪些事件,以及他们的关系和事件发生的时间。
概述
ApplicationEvent是spring系中事件的父类,该类同样继承了 java中的EventObject。ApplicationContextEvent是springContext的基础事件类。SpringApplicationEvent是springBoot的基础事件类。
SpringContext中的事件类
说明图
| 类 | 说明 |
|---|---|
| ContextClosedEvent | ApplicationContext关闭时引发的事件。此事件在调用 ApplicationContext 的 close() 方法或停止 Spring 应用程序时触发。 |
| ContextRefreshedEvent | 当 ApplicationContext 被初始化或刷新时会发布此事件。此事件在调用 ApplicationContext 的 refresh() 方法或启动 Spring 应用程序时触发。 |
| ContextStartedEvent | ContextStartedEvent 是 Spring 中的一个事件,当 ApplicationContext 启动时会发布此事件。此事件在调用 ApplicationContext 的 start() 方法或启动 Spring 应用程序时触发。 |
| ContextStoppedEvent | ContextStoppedEvent 是 Spring 中的一个事件,当 ApplicationContext 停止时会发布此事件。此事件在调用 ApplicationContext 的 stop() 方法或停止 Spring 应用程序时触发。 |
spring中close()和stop()方法区别
| 方法 | 说明 |
|---|---|
| close | close() 会销毁所有 bean 并释放所有资源 |
| stop | stop() 方法仅会暂停所有组件并释放由上下文保留的资源 |
换句话说,close() 是一个更加积极的操作,它会完全关闭应用程序上下文,而 stop() 允许应用程序上下文在稍后重新启动。
值得注意的是,stop() 方法通常与 start() 方法一起使用,start() 方法用于启动已停止的应用程序上下文。start() 方法会恢复所有组件,并使上下文准备好处理请求。
源码:
@Override
public void start() {
getLifecycleProcessor().start();
publishEvent(new ContextStartedEvent(this));
}
@Override
public void stop() {
getLifecycleProcessor().stop();
publishEvent(new ContextStoppedEvent(this));
}
使用示列
方式一
@Component
public class MyContextStartedEventListener implements ApplicationListener<ContextStartedEvent> {
@Override
public void onApplicationEvent(ContextStartedEvent event) {
// 执行在应用程序上下文启动时需要进行的操作
}
}
方式二
@Component
public class MyContextStartedEventListener {
@EventListener
public void handleContextStartedEvent(ContextStartedEvent event) {
// 执行在应用程序上下文启动时需要进行的操作
}
}
SpringBoot中的事件类
其使用方式和SpringContext中描述的一致。
| 类 | 说明 |
|---|---|
| ApplicationContextInitializedEvent | 当SpringApplication正在启动并且ApplicationContext已准备好并且ApplicationContextInitializers已被调用但在加载任何bean定义之前发布的事件。 |
| ApplicationEnvironmentPreparedEvent | 当SpringApplication启动时发布的事件 。 |
| ApplicationFailedEvent | SpringApplication启动失败触发的事件 |
| ApplicationPreparedEvent | 事件在 SpringApplication 启动时发布ApplicationContext 已完全准备就绪,但未刷新。bean定义将被加载,并且 Environment 已准备就绪,可在此阶段使用。 |
| ApplicationReadyEvent | SpringApplication已经准好了的事件 |
| ApplicationStartedEvent | 在应用程序上下文刷新后但在调用任何应用程序(ApplicationRunner)和命令行运行程序之前(CommandLineRunner)发布的事件。 |
| ApplicationStartingEvent | 一个在程序启动周期内的事件。 |
顺序图
一起进步
你好,我是啊Q,是一个爱技术爱生活的的程序员。
写程序几年了,现在想记录一下自己的程序员生活和故事,来掘金和大家交朋友。写的不好请多多包涵,支持一下。
我是啊Q,可掘金关注或私信我,我们一起进步。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,[点击查看活动详情](<juejin.cn/post/719472…)