Spring Boot 的启动流程
Spring Boot 的启动流程是一个复杂的自动化过程,核心围绕 SpringApplication 类的初始化与 run()
方法展开。以下是其关键步骤的详细分析:
一、初始化阶段:SpringApplication
实例化
当调用 SpringApplication.run(主类.class, args)
时,会先构造 SpringApplication
对象:
- 推断应用类型
根据类路径判断是Servlet
(Web)、Reactive
(响应式)还是普通应用,决定后续创建何种ApplicationContext
。 - 加载
ApplicationContextInitializer
通过META-INF/spring.factories
加载所有ApplicationContextInitializer
实现类,用于在ApplicationContext
初始化前扩展配置。 - 加载
ApplicationListener
同样通过spring.factories
加载事件监听器,监听 Spring Boot 生命周期事件(如环境准备完成、上下文就绪等)。 - 识别主配置类
通过堆栈分析找到包含main
方法的类(即启动类),将其标记为主配置类。
二、执行阶段:run()
方法流程
run()
方法是 Spring Boot 启动的核心入口,流程如下:
1. 启动监听器通知
SpringApplicationRunListeners
发布ApplicationStartingEvent
通知所有SpringApplicationRunListener
应用启动开始。
2. 准备环境(Environment)
- 创建并配置环境对象
根据应用类型创建StandardServletEnvironment
(Web)或StandardEnvironment
。 - 加载配置源
加载命令行参数、application.properties
、application.yml
、环境变量等。 - 发布
ApplicationEnvironmentPreparedEvent
通知监听器环境已准备好,此时可修改环境配置(如EnvironmentPostProcessor
扩展)。
3. 打印 Banner
- 根据
spring.banner.location
或默认规则加载 Banner,输出到控制台。
4. 创建 ApplicationContext
- 根据应用类型实例化上下文
- Servlet Web:
AnnotationConfigServletWebServerApplicationContext
- Reactive Web:
AnnotationConfigReactiveWebServerApplicationContext
- 非 Web:
AnnotationConfigApplicationContext
- Servlet Web:
5. 准备上下文
- 设置环境、注册 Bean
- 将
Environment
绑定到上下文。 - 注册
BeanNameGenerator
、主配置类(启动类)等。
- 将
- 调用
ApplicationContextInitializer
执行所有初始化器(如设置上下文 ID、激活 Profile)。
6. 刷新上下文:refreshContext()
这是 Spring 容器的核心初始化过程(继承自 Spring Framework):
BeanFactory
准备
加载 Bean 定义(如@ComponentScan
扫描的类、@Import
导入的配置类)。- 执行
BeanFactoryPostProcessor
例如ConfigurationClassPostProcessor
解析@Configuration
类。 - 执行
BeanPostProcessor
处理 Bean 初始化前后的逻辑(如 AOP 代理)。 - 初始化消息源、事件广播器等
- 启动内嵌 Web 服务器
(仅 Web 应用)如 Tomcat、Netty,通过ServletWebServerApplicationContext
启动。 - 发布
ApplicationContextInitializedEvent
7. 后置处理
- 发布
ApplicationPreparedEvent
上下文已刷新,但未启动。 - 注册关闭钩子
确保 JVM 退出时优雅关闭 Spring 上下文。 - 完成 Runner 执行
调用所有CommandLineRunner
和ApplicationRunner
的run()
方法。 - 发布
ApplicationStartedEvent
和ApplicationReadyEvent
分别表示应用已启动和完全就绪。
三、关键扩展点
ApplicationContextInitializer
自定义上下文初始化逻辑(如设置属性)。ApplicationListener
监听事件(如ApplicationEnvironmentPreparedEvent
)实现动态配置。BeanFactoryPostProcessor
修改 Bean 定义(如动态注册 Bean)。CommandLineRunner
/ApplicationRunner
在应用就绪后执行启动任务。
四、自动配置原理
@SpringBootApplication
组合了@SpringBootConfiguration
、@ComponentScan
和@EnableAutoConfiguration
。@EnableAutoConfiguration
通过SpringFactoriesLoader
加载META-INF/spring.factories
中定义的AutoConfiguration
类。- 条件化装配
使用@ConditionalOnClass
、@ConditionalOnMissingBean
等条件注解按需装配 Bean。
流程图简化
启动类 -> SpringApplication构造 -> run()
-> 发布StartingEvent
-> 准备Environment -> 发布EnvironmentPreparedEvent
-> 创建ApplicationContext
-> 刷新Context(加载Bean、启动WebServer)
-> 调用Runners
-> 发布ReadyEvent
通过这一流程,Spring Boot 实现了零 XML 配置的快速启动,结合 Starter 机制和条件化自动配置,显著简化了 Spring 应用的搭建。