ApplicationRunner 是 Spring Boot 中在应用上下文加载完成、SpringApplication.run() 返回前执行初始化逻辑的接口,比 @PostConstruct 晚、比 ApplicationReadyEvent 早;需实现 run(ApplicationArguments) 方法,支持结构化参数解析,可通过 @Order 或 Ordered 控制执行顺序,推荐优先使用。

在 Spring Boot 中,ApplicationRunner 是一个接口,用于在应用上下文加载完成、但 SpringApplication.run() 尚未完全返回前执行自定义初始化逻辑。它比 @PostConstruct 更早(后者在 Bean 初始化后立即执行),又比 @EventListener(ApplicationReadyEvent.class) 更早(后者在应用真正“就绪”后触发)。
实现 ApplicationRunner 接口
只需创建一个类,实现 ApplicationRunner,并用 @Component 注册为 Spring Bean:
- 重写
run(ApplicationArguments args)方法,编写启动时要执行的逻辑 - 方法参数
ApplicationArguments可用来获取命令行参数(如--server.port=8081)或非选项参数(如app.jar arg1 arg2) - Spring 容器会自动识别并按顺序调用所有
ApplicationRunnerBean
控制执行顺序
当有多个 ApplicationRunner 时,可通过实现 Ordered 接口或添加 @Order 注解来指定执行优先级(数值越小越先执行):
-
@Order(1)表示高优先级,会在@Order(2)之前运行 - 不加
@Order的默认顺序为Ordered.LOWEST_PRECEDENCE(即最后执行) - 也可让类实现
Ordered接口并重写getOrder()方法
与 CommandLineRunner 的区别
ApplicationRunner 和 CommandLineRunner 功能类似,主要差异在于参数类型:
立即学习“Java免费学习笔记(深入)”;
-
ApplicationRunner.run()接收ApplicationArguments—— 提供结构化访问选项参数(option arguments)和非选项参数(non-option arguments),更安全、语义清晰 -
CommandLineRunner.run()接收原始String[],需手动解析,易出错 - 推荐优先使用
ApplicationRunner,尤其涉及参数解析时
典型使用场景
常见于需要在应用启动后、对外提供服务前完成的检查或预热操作:
- 检查外部依赖是否可用(如数据库连接、Redis 连通性)
- 加载缓存数据或初始化本地配置
- 注册服务到注册中心(如 Nacos、Eureka)的前置校验
- 打印启动成功日志或健康摘要信息
注意:若任务耗时较长或可能失败,建议加入超时控制和异常处理,并考虑是否应降级或阻断启动流程。


















