5月30日 00:10

Spring Boot 的启动流程是怎样的?关键阶段有哪些?

Spring Boot 启动本质上是 SpringApplication.run() 创建并刷新 Spring 容器的过程。主线可以记成:创建 SpringApplication、准备 Environment、创建 ApplicationContext、刷新容器、启动 WebServer、执行 Runner、发布 ready 事件。真正初始化 Bean、自动配置和启动内嵌 Tomcat 的核心都发生在 refreshContext() 里的 ApplicationContext.refresh()

追问

SpringApplication 实例化时做了什么?

它会推断应用类型:Servlet、Reactive 或普通应用;再加载 ApplicationContextInitializerApplicationListener,并推断 main 方法所在主类。这一步还没创建业务 Bean,只是在准备启动所需的元信息。

Environment 是什么时候准备的?

在创建 ApplicationContext 之前。Spring Boot 会合并命令行参数、系统属性、环境变量、application.yml/properties 和 profile 配置,再发布 ApplicationEnvironmentPreparedEvent

refresh() 为什么最关键?

因为它会加载 BeanDefinition、执行 BeanFactoryPostProcessor、注册 BeanPostProcessor、实例化非懒加载单例 Bean。Servlet 应用的内嵌 Tomcat/Jetty 通常也在刷新过程的 onRefresh() 阶段创建并启动。

Runner 在什么时候执行?

ApplicationRunnerCommandLineRunner 在容器刷新完成、ApplicationStartedEvent 发布后执行。它们适合做启动后的初始化任务,但不要放耗时阻塞逻辑,否则应用迟迟到不了 ready 状态。

启动失败会发生什么?

Spring Boot 会发布 ApplicationFailedEvent,销毁已创建的 Bean,并把异常继续抛出。排查启动问题时,重点看 Environment、自动配置条件和 Bean 创建异常。

写段代码

java
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
标签:Spring Boot