Spring Boot 的启动流程是怎样的?关键阶段有哪些?
Spring Boot 启动本质上是 SpringApplication.run() 创建并刷新 Spring 容器的过程。主线可以记成:创建 SpringApplication、准备 Environment、创建 ApplicationContext、刷新容器、启动 WebServer、执行 Runner、发布 ready 事件。真正初始化 Bean、自动配置和启动内嵌 Tomcat 的核心都发生在 refreshContext() 里的 ApplicationContext.refresh()。
追问
SpringApplication 实例化时做了什么?
它会推断应用类型:Servlet、Reactive 或普通应用;再加载 ApplicationContextInitializer、ApplicationListener,并推断 main 方法所在主类。这一步还没创建业务 Bean,只是在准备启动所需的元信息。
Environment 是什么时候准备的?
在创建 ApplicationContext 之前。Spring Boot 会合并命令行参数、系统属性、环境变量、application.yml/properties 和 profile 配置,再发布 ApplicationEnvironmentPreparedEvent。
refresh() 为什么最关键?
因为它会加载 BeanDefinition、执行 BeanFactoryPostProcessor、注册 BeanPostProcessor、实例化非懒加载单例 Bean。Servlet 应用的内嵌 Tomcat/Jetty 通常也在刷新过程的 onRefresh() 阶段创建并启动。
Runner 在什么时候执行?
ApplicationRunner 和 CommandLineRunner 在容器刷新完成、ApplicationStartedEvent 发布后执行。它们适合做启动后的初始化任务,但不要放耗时阻塞逻辑,否则应用迟迟到不了 ready 状态。
启动失败会发生什么?
Spring Boot 会发布 ApplicationFailedEvent,销毁已创建的 Bean,并把异常继续抛出。排查启动问题时,重点看 Environment、自动配置条件和 Bean 创建异常。
写段代码
java@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }