浅析Spring,SpringBoot的事件

431 阅读3分钟

简述:我们经常会在写代码时,会通过spring或者springBoot的各个节点做一些操作,比如对某一个对象实例做初始化操作或者做扩展。那么我们来梳理一下spring和springBoot中提供了哪些事件,以及他们的关系和事件发生的时间。

概述

  1. ApplicationEvent 是spring系中事件的父类,该类同样继承了 java中的 EventObject
  2. ApplicationContextEvent是springContext的基础事件类。
  3. SpringApplicationEvent是springBoot的基础事件类。

SpringContext中的事件类

说明图

说明
ContextClosedEventApplicationContext关闭时引发的事件。此事件在调用 ApplicationContext 的 close() 方法或停止 Spring 应用程序时触发。
ContextRefreshedEvent当 ApplicationContext 被初始化或刷新时会发布此事件。此事件在调用 ApplicationContext 的 refresh() 方法或启动 Spring 应用程序时触发。
ContextStartedEventContextStartedEvent 是 Spring 中的一个事件,当 ApplicationContext 启动时会发布此事件。此事件在调用 ApplicationContext 的 start() 方法或启动 Spring 应用程序时触发。
ContextStoppedEventContextStoppedEvent 是 Spring 中的一个事件,当 ApplicationContext 停止时会发布此事件。此事件在调用 ApplicationContext 的 stop() 方法或停止 Spring 应用程序时触发。

spring中close()和stop()方法区别

方法说明
closeclose() 会销毁所有 bean 并释放所有资源
stopstop() 方法仅会暂停所有组件并释放由上下文保留的资源

换句话说,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启动时发布的事件 。
ApplicationFailedEventSpringApplication启动失败触发的事件
ApplicationPreparedEvent事件在 SpringApplication 启动时发布ApplicationContext 已完全准备就绪,但未刷新。bean定义将被加载,并且 Environment 已准备就绪,可在此阶段使用。
ApplicationReadyEventSpringApplication已经准好了的事件
ApplicationStartedEvent在应用程序上下文刷新后但在调用任何应用程序(ApplicationRunner)和命令行运行程序之前(CommandLineRunner)发布的事件。
ApplicationStartingEvent一个在程序启动周期内的事件。

顺序图

一起进步

你好,我是啊Q,是一个爱技术爱生活的的程序员。

写程序几年了,现在想记录一下自己的程序员生活和故事,来掘金和大家交朋友。写的不好请多多包涵,支持一下。

我是啊Q,可掘金关注或私信我,我们一起进步。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,[点击查看活动详情](<juejin.cn/post/719472…)