SpringApplicationRunListener 是 Spring Boot 提供的底层启动扩展机制,通过 7 个主动回调方法(starting、environmentPrepared、contextPrepared、contextLoaded、started、running、failed)在应用启动各阶段插入自定义逻辑,需实现接口并配置 spring.factories。

SpringApplicationRunListener 是 Spring Boot 提供的底层扩展机制,用于在应用启动的各个关键阶段(如环境准备、上下文刷新前、容器启动后等)插入自定义逻辑。它比 @EventListener 更早、更底层,适合做初始化监控、环境校验、日志埋点等基础设施级操作。
理解 SpringApplicationRunListener 的触发时机
它不是事件监听器(不基于 Spring Event),而是由 SpringApplication 在启动流程中**主动回调**的一组固定方法,共 7 个阶段(Spring Boot 2.7+ 对应 SpringApplicationRunListener 接口的 7 个方法)。关键节点包括:
-
starting():启动刚开始,SpringApplication实例已创建,但环境和上下文都未准备 -
environmentPrepared():环境(ConfigurableEnvironment)已加载并配置完成,可读取application.properties、profile 等 -
contextPrepared():ApplicationContext实例已创建,但尚未加载 bean 定义 -
contextLoaded():所有 bean 定义已加载进上下文,但尚未刷新(refresh()未执行) -
started():上下文已刷新(refresh()完成),但CommandLineRunner和ApplicationRunner尚未执行 -
running():整个启动流程完成,应用已就绪,所有 runner 执行完毕 -
failed():启动异常时回调,参数包含异常对象
自定义 SpringApplicationRunListener 的实现方式
需实现接口,并通过 META-INF/spring.factories 声明,Spring Boot 启动时会自动加载。步骤如下:
- 新建类实现
org.springframework.boot.SpringApplicationRunListener - 提供含
SpringApplication和String[] args的构造函数(必须) - 重写需要监听的方法(无需全部实现,空方法体即可)
- 在
src/main/resources/META-INF/spring.factories中添加:
典型使用场景与注意事项
适用于非业务逻辑的启动期干预,比如:
立即学习“Java免费学习笔记(深入)”;
- 启动耗时统计:在
starting()记开始时间,running()计算总耗时并打日志 - 环境合规检查:在
environmentPrepared()中校验必要系统属性或配置项是否存在 - 上下文预处理:在
contextPrepared()中向ApplicationContext添加自定义BeanFactoryPostProcessor - 失败诊断:在
failed()中收集堆栈、dump 线程或发送告警
注意:该接口运行在主线程,方法内避免阻塞或耗时操作;不能依赖已加载的 Bean(早期阶段上下文尚未刷新);多个 listener 按声明顺序调用,无优先级控制。
替代方案对比:何时选它而非 @EventListener?
如果只需要监听 ApplicationReadyEvent 或 ContextRefreshedEvent 这类标准事件,用 @EventListener 更简单清晰。而 SpringApplicationRunListener 的价值在于:
- 能捕获
environmentPrepared等 事件机制不可达的早期阶段 - 不依赖 Spring 容器(
starting时容器都还没创建) - 更适合框架层/中间件封装,比如 SkyWalking、Arthas 的启动探针
普通业务模块一般不需要,除非你正在开发 Starter 或做深度启动治理。


















