Java面试题更新 2026-08-03

请列举并比较在 SpringBoot 应用启动完成阶段执行自定义逻辑的常见实现方案。

考察说明

考查对 SpringBoot 生命周期扩展点的理解及多种实现方式的选型能力。

回答思路

  1. 【回答框架 1】SpringBoot 应用启动过程主要分为 SpringApplication 的 run 阶段和 ApplicationContext 的刷新阶段。在启动时执行特定代码,常用的扩展点包括 ApplicationRunner、CommandLineRunner、ApplicationListener 监听 ApplicationReadyEvent、InitializingBean 接口、@PostConstruct 注解以及 ApplicationContext 的 refresh 回调。其中 ApplicationRunner 和 CommandLineRunner 在 SpringApp
  2. 【回答框架 2】ApplicationRunner 和 CommandLineRunner 的区别在于参数类型:CommandLineRunner 接收字符串数组,即原始命令参数;ApplicationRunner 接收封装后的 ApplicationArguments,便于解析选项参数和非选项参数。若需要获取参数并处理键值对,推荐 ApplicationRunner。多个 runner 可通过 @Order 注解或实现 Ordered 接口控制执行次序。
  3. 【回答框架 3】监听 ApplicationReadyEvent 事件也可在应用完全启动并 ready 后执行逻辑,适合需要依赖完整容器和外部组件就绪的场景。@PostConstruct 和 InitializingBean 在 Bean 初始化阶段执行,早于 runner 和 ready 事件,若在此时依赖其他尚未初始化的 Bean 可能产生空指针。
  4. 【回答框架 4】选择方式需结合需求:若代码需在应用真正对外提供服务前执行初始化,用 ApplicationRunner 或 CommandLineRunner;若需在应用完全启动后执行异步任务、通知等,则监听 ApplicationReadyEvent;若只是安全的 Bean 初始化后处理,@PostConstruct 更轻量。
  5. 【关键点 1】ApplicationRunner 与 CommandLineRunner 是 SpringBoot 提供的专门启动回调,在 context 刷新后、应用 ready 前执行。
  6. 【关键点 2】ApplicationRunner 接收 ApplicationArguments,支持解析选项参数,优于 CommandLineRunner 的原始数组。
  7. 【关键点 3】监听 ApplicationReadyEvent 在应用完全启动后执行,适合对外交互或异步任务。
  8. 【关键点 4】@PostConstruct 和 InitializingBean 属于 Bean 初始化阶段,执行时间早于 runner。
  9. 【关键点 5】多个回调可通过 @Order 控制执行顺序。
  10. 【易错点 1】误用 @PostConstruct 在依赖未装配时执行,导致空指针异常。
  11. 【易错点 2】盲目在启动回调中执行耗时操作,延长应用启动时间。
  12. 【易错点 3】忽略 ApplicationReadyEvent 的触发条件,在 SpringApplication 未以 web 方式运行时仍依赖 web 环境。