Skip to content

生命周期监听

自定义 SpringApplicationRunListener 来监听事件

  • 编写 SpringApplicationRunListener 实现类
  • META-INF/spring-factories 中配置 org.springframework.boot.SpringApplicationRunListener=自己的 Listener , 还可以指定一个有参构造器
  • springbootspring-boot.jar 中配置了默认的 Listener : EventPublishingRunListener
java
/**
 * springboot 生命周期监听
 *
 * Listener 先要从 MATE-INF/spring.factories 读到
 *
 * 1、 引导: 利用  BootstrapContext 引导整个项目启动
 *      starting : 应用开始,SpringApplication 的 run 方法一调用,只要有了 BootstrapContext 就执行
 *      environmentPrepared : 环境准备好(把启动参数等绑定到环境变量中),但是 IOC 还没有创建
 * 2、启动:
 *      contextPrepared: IOC 容器创建并准备好,但是 sources(主配置类)没加载。并关闭引导上下文
 *      contextLoaded: IOC 容器加载,主配置类加载进去了。但是 IOC 容器还没刷新 (bean 未创建到 IOC 容器内)
 *      ========= 截止之前,IOC 容器里面还没有造 bean =====
 *      started: IOC 容器刷新(bean 已经造好),但还没有调用 runner
 *      ready: 所有的 runner 都执行完,并且 IOC 容器也刷新完成
 *
 * 3、运行
 *      如果以上步骤失败就会调用 failed 
 */
public class MyAppListener implements SpringApplicationRunListener {
    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("==========environmentPrepared 环境准备完成==========");
    }
    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("==========contextPrepared IOC容器准备完成==========");
    }
    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("==========starting 正在启动==========");
    }
    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("=========contextLoaded  IOC容器加载完成==================");
    }
    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("========started 应用启动完成  =====================");
    }
    @Override
    public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("=========ready  应用准备就绪 ==========");
    }
    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("=============failed  应用启动失败=======================");
    }
}

生命周期1.png