2023-10-13 05:20:47
SpringApplicationRunListener 是 Spring Boot 提供的核心接口,用于在应用启动的不同阶段插入自定义逻辑,实现精细化控制启动过程。其典型使用场合包括记录启动时间、初始化第三方服务、动态配置环境变量等场景。
核心使用场景记录应用启动时间
用途:通过在 starting() 和 started()/running() 阶段记录时间戳,计算启动耗时,辅助性能优化。
示例:
starting():记录启动开始时间。
started():计算并输出从启动到上下文就绪的耗时。
running():确认应用完全启动,可记录最终耗时。
初始化第三方服务
用途:在关键阶段(如 environmentPrepared() 或 contextPrepared())初始化配置中心、消息队列、数据库连接池等依赖服务,并进行健康检查。
示例:
金融交易系统:在 environmentPrepared() 阶段连接配置服务,在 contextPrepared() 阶段检查消息队列状态。若服务不可用,通过抛出异常中断启动,避免不稳定状态。
动态配置纳粗环皮茄腊境变量
用途:在 environmentPrepared() 阶段根据运行时环境(如云平台、测试环境)动态调整环境变量(如数据库URL、日志级别)。
示例:
从外部配置服务读取动态参数,覆盖默认环境变量值。
数据预加载与缓存预热
用途:在 contextLoaded() 阶段预加载关键数据(如商品信息、用户数据)到内存缓存,避免高并发下首次请求延迟。
示例:
电商平台:在 contextLoaded() 中调用数据服务加载促销活动、热门商品等数据,提升用户响应速度。
启动失败处理
用途:在 failed() 阶段捕获异常并执行清理逻辑(如释放资源、发送告警),提升系统健壮性。
示例:
记录失败日志、通知运维团队,或触发降级策略。
starting()
触发时机:应用启动初期,参数未解析。
典型操作:初始化计时器、打印启动日志。
environmentPrepared(ConfigurableEnvironment environment)
触发时机:环境变量已准备,但燃滑容器未创建。
典型操作:修改环境变量、初始化配置服务。
contextPrepared(ConfigurableApplicationContext context)
触发时机:应用上下文创建完成,但未刷新。
典型操作:检查外部服务健康状态、注册早期Bean。
contextLoaded(ConfigurableApplicationContext context)
触发时机:上下文完全加载,Bean已定义但未实例化。
典型操作:数据预加载、缓存预热。
started(ConfigurableApplicationContext context)
触发时机:上下文启动完成,但未调用 CommandLineRunners。
典型操作:记录启动耗时、触发非关键初始化任务。
running(ConfigurableApplicationContext context)
触发时机:应用完全启动,CommandLineRunners 已执行。
典型操作:发送启动成功通知、启动监控任务。
failed(ConfigurableApplicationContext context, Throwable exception)
触发时机:启动失败时调用。
典型操作:异常处理、资源清理。
实现接口
创建自定义类实现 SpringApplicationRunListener,并重写所需方法。
示例代码:
public class MyApplicationRunListener implements SpringApplicationRunListener { private final SpringApplication application; private final String[] args; public MyApplicationRunListener(SpringApplication application, String[] args) { this.application = application; this.args = args; } @Override public void starting() { System.out.println("Application starting..."); } @Override public void environmentPrepared(ConfigurableEnvironment environment) { System.out.println("Environment prepared."); } // 其他方法实现...}注册监听器
在 META-INF/spring.factories 文件中配置全限定类名:
org.springframework.boot.SpringApplicationRunListener=com.example.MyApplicationRunListener金融交易系统
需求:依赖配置服务和消息队列,启动时需确保服务可用。
实现:
在 environmentPrepared() 中初始化配置服务客户端。
在 contextPrepared() 中检查消息队列连接状态,若失败则抛出异常终止启动。
电商平台
需求:启动时预加载商品数据和促销信息到缓存。
实现:
在 contextLoaded() 中调用数据服务API,将结果存入Redis缓存。
通过合理使用 SpringApplicationRunListener,开发者可以显著优化 Spring Boot 应用的启动效率和稳定性。