Spring Boot源码(三) - SpringApplicationRunListener(EventPublishingRunListener)生命周期和回调时机

目录

一、SpringApplicationRunListener生命周期方法

二、EventPublishingRunListener

三、总结


一、SpringApplicationRunListener生命周期方法

    Spring Boot定义的SpringApplicationRunListener实现类只有EventPublishingRunListener,主要是定义了其生命周期,并且在Spring Boot启动过程中完成回调。如果自定义实现的话,则需要使用自动装配的方式将自己添加到

META-INF/spring.factories中才能被执行回调。先看看定义的接口:

public interface SpringApplicationRunListener {
    // run方法开始执行时
    default void starting() {
    }
    // Environment准备好之后
    default void environmentPrepared(ConfigurableEnvironment environment) {
    }
    // ApplicationContext准备好之后
    default void contextPrepared(ConfigurableApplicationContext context) {
    }
    // ApplicationContext加载完成
    default void contextLoaded(ConfigurableApplicationContext context) {
    }
    // run方法启动完成,回调ApplicationRunner和CommandLineRunner之前
    default void started(ConfigurableApplicationContext context) {
    }
    // run方法执行完成,马上出方法栈时
    default void running(ConfigurableApplicationContext context) {
    }
    // 运行异常时,执行的逻辑
    default void failed(ConfigurableApplicationContext context, Throwable exception) {
    }
}

1、starting

    在一切准备就绪,准备启动时。

2、environmentPrepared

    在prepareEnvironment方法内部调用。

3、contextPrepared

    在prepareContext的开始阶段被调用。

4、contextLoaded

    在prepareContext的最后一步被调用。

5、started

    在所有执行完成,ApplicationRunner和CommandLineRunner回调之前。

6、running

    在run方法最后单独使用try catch执行,只要上面没有异常,项目已经启动完成。那么running回调异常也不能影响正常流程。

7、failed

    在handleRunFailure异常处理中被调用。

 

二、EventPublishingRunListener

    在Spring Boot中实现了SpringApplicationRunListener接口的只有EventPublishingRunListener。其属性和构造如下:

public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {
    // Spring上下文
    private final SpringApplication application;
    // main方法启动的参数
    private final String[] args;
    // 事件发送器
    private final SimpleApplicationEventMulticaster initialMulticaster;

    public EventPublishingRunListener(SpringApplication application, String[] args) {
        this.application = application;
        this.args = args;
        this.initialMulticaster = new SimpleApplicationEventMulticaster();
        for (ApplicationListener<?> listener : application.getListeners()) {
            this.initialMulticaster.addApplicationListener(listener);
        }
    }
    // 其余省略
}

    在构造函数中赋值了ApplicationContext和args,并且创建了SimpleApplicationEventMulticaster事件发送器。在SpringApplicationContext的refresh时会创建SimpleApplicationEventMulticaster,但是现在还未执行refresh,则需要提前创建该对象。详细可以参见:Spring源码-事件监听机制(实现EventListener接口)或者Spring源码-事件监听机制(@EventListener实现方式)。而对应SpringApplicationRunListener每个生命周期,则只是发送某一种特定的事件,如starting

@Override
public void starting() {
    this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args));
}

 

SpringApplicationRunListener生命周期和对应事件发送类型为:

starting
ApplicationStartingEvent
environmentPrepared
ApplicationEnvironmentPreparedEvent
contextPrepared
ApplicationContextInitializedEvent
contextLoaded
ApplicationPreparedEvent
started
ApplicationStartedEvent
running
ApplicationReadyEvent
failed
ApplicationFailedEvent

三、总结

    在知道了SpringApplicationRunListener的回调方法和时机后,那么我们可以在项目中添加自己的业务逻辑和扩展。主要有两种方式:

1)、自己写一个SpringApplicationRunListener实现类。只是需要实现7个接口,估计很多都是空方法。

2)、按照执行时机,自己实现不同类型的事件监听(如 implements ApplicationListener<ApplicationStartingEvent>)。

    只是需要注意,如果想实现多个相同时机的事件时,如果想按照顺序执行。实现SpringApplicationRunListener方式可以按照@Order进行排序, 而我们知道Spring的事件发送机制是无序的。

 

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值