You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中ApplicationRunner.run()是否在所有Bean创建后执行?

Spring Boot ApplicationRunner.run() 执行时机及与ContextRefreshedEvent对比

核心结论

ApplicationRunner的run()方法是在所有单例Bean都完成初始化之后执行的,并非仅自身Bean创建完成就触发。拿你提供的示例来说,OtherClass作为单例@Component,会在MyRunner.run()执行前就已经被创建并初始化完成。

对官方文档的解读纠正

你引用的官方文档描述“标识Bean应在被包含于SpringApplication时运行”,这里的“运行时机”是指Spring Boot应用上下文完成**刷新(refresh)**之后——而上下文刷新的核心步骤就是初始化所有单例Bean。所以文档并没有表达“仅自身Bean创建后就运行”的意思,而是明确该Bean的逻辑会在应用启动的特定阶段(上下文就绪后)执行。

ApplicationRunner vs ApplicationListener

两者都能实现启动后执行逻辑的需求,但适用场景有区别:

  • ApplicationRunner(Spring Boot特有):
    • 专门为应用启动后执行逻辑设计,只会在应用启动完成时执行一次(上下文首次刷新后)。
    • 支持直接接收ApplicationArguments对象,方便处理命令行参数(比如解析--foo=bar这类参数),使用更简洁。
  • ApplicationListener(Spring框架通用):
    • 只要Spring上下文发生刷新就会触发,在Web应用中可能会执行多次(比如根上下文和DispatcherServlet的上下文都会触发刷新)。如果要实现仅启动一次的逻辑,需要额外判断是否为根上下文或首次刷新。
    • 更适合监听上下文的刷新事件(比如非启动场景的上下文更新)。

场景选择建议

如果你的需求是Spring Boot应用启动后执行一次初始化逻辑,优先选择ApplicationRunner(或CommandLineRunner,两者仅参数处理方式不同)。它更贴合Boot的启动流程,无需额外处理重复触发的问题。如果需要监听通用的上下文刷新事件,再考虑使用ContextRefreshedEvent监听器。

内容的提问来源于stack exchange,提问作者leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:17:17