1. Spring Boot启动流程深度解析
Spring Boot的启动过程看似简单,实则暗藏玄机。很多开发者只停留在"main方法+@SpringBootApplication"的认知层面,却不知背后隐藏着复杂的初始化逻辑和精妙的设计思想。今天我们就来彻底拆解这个看似简单实则精妙的过程。
1.1 启动流程全景图
Spring Boot的启动流程可以概括为五个核心阶段:
- 初始化阶段:准备运行环境
- 配置阶段:加载应用配置
- 上下文准备阶段:创建并配置应用上下文
- 刷新阶段:执行核心初始化逻辑
- 后处理阶段:执行启动后回调
每个阶段都包含多个子步骤,环环相扣,共同构成了Spring Boot强大的启动机制。
2. 初始化阶段详解
2.1 启动入口分析
标准的Spring Boot应用启动代码如下:
java复制@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
这段简单的代码背后,Spring Boot做了大量工作。首先,它会创建一个SpringApplication实例,这是整个启动流程的控制器。
2.2 SpringApplication构造过程
SpringApplication的构造过程包含几个关键步骤:
- 推断web应用类型:根据类路径判断是Servlet应用、Reactive应用还是普通应用
- 设置初始化器(Initializers):从META-INF/spring.factories加载ApplicationContextInitializer实现
- 设置监听器(Listeners):同样从spring.factories加载ApplicationListener实现
- 推断主配置类:通过堆栈分析确定main方法所在的类
提示:初始化器和监听器的加载顺序会影响某些扩展功能的执行时机,需要特别注意。
3. 配置阶段深入剖析
3.1 环境准备
Spring Boot会创建一个ConfigurableEnvironment实例来管理配置信息。环境准备包括:
- 创建环境对象:根据应用类型创建StandardEnvironment或StandardServletEnvironment
- 配置属性源:加载系统属性、环境变量、配置文件等
- 转换服务配置:配置属性转换服务,支持类型转换
3.2 配置文件加载机制
Spring Boot支持多种配置源,加载顺序如下:
- 默认属性(通过SpringApplication.setDefaultProperties设置)
- @Configuration类上的@PropertySource注解
- 配置文件(application.properties/yml)
- 先加载打包在jar内的配置文件
- 再加载jar外部的配置文件
- 随机属性(random.*)
配置文件的位置也有特定搜索顺序:
- 当前目录的/config子目录
- 当前目录
- classpath下的/config包
- classpath根目录
4. 上下文准备阶段
4.1 应用上下文创建
Spring Boot会根据应用类型创建不同的应用上下文:
- Web应用:AnnotationConfigServletWebServerApplicationContext
- Reactive应用:AnnotationConfigReactiveWebServerApplicationContext
- 普通应用:AnnotationConfigApplicationContext
创建上下文后,会执行prepareContext方法进行预处理:
- 设置环境
- 后置处理上下文
- 应用初始化器
- 触发上下文准备事件
4.2 Bean定义加载
Spring Boot通过AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner加载Bean定义:
- 注册主配置类(@SpringBootApplication标注的类)
- 扫描@Component组件
- 处理@Import注解
- 处理@Bean方法
注意:这个阶段只是注册Bean定义,还没有实例化任何Bean。
5. 刷新阶段核心逻辑
5.1 上下文刷新流程
refresh()方法是Spring容器初始化的核心,主要步骤包括:
- prepareRefresh:准备刷新上下文
- obtainFreshBeanFactory:获取或创建BeanFactory
- prepareBeanFactory:配置标准BeanFactory特性
- postProcessBeanFactory:执行BeanFactory后置处理器
- invokeBeanFactoryPostProcessors:调用BeanFactoryPostProcessor
- registerBeanPostProcessors:注册BeanPostProcessor
- initMessageSource:初始化消息源
- initApplicationEventMulticaster:初始化事件广播器
- onRefresh:模板方法,子类可扩展
- registerListeners:注册监听器
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容