Spring Boot启动流程
SpringApplication.run(SpringBootLearnApplication.class, args);该方法包含了两大步骤:
一、new SpringApplication 对象
- 配置资源
- 判断是否为Web环境
- 设置初始化构造器和监听器(通过
getSpringFactoriesInstances方法,获取指定路径下的 META-INF/spring.factories 文件中指定类的实例,ApplicationContextInitializer和ApplicationListener) - 推断应用程序主类(指 SpingBoot 项目的启动类)
二、 运行 SpringApplication#run 方法
- 获取监听器并启动(通过
getSpringFactoriesInstances方法获取SpringApplicationRunListener) - 准备容器运行环境(配置Web环境)
- 创建应用程序上下文 (SERVLET 类型为例,它会创建
AnnotationConfigServletWebServerApplicationContext应用上下文实例) - 准备上下文(给上下文赋值,获取所有配置源信息,加载 Spring 应用上下文配置源,将 BeanDefinition 加载到 context 中,发布上下文已准备事件)
- 刷新上下文,进行初始化流程(
refresh())- 刷新容器前的准备工作,设置参数和验证必须属性
- 获取 BeanFactory,为 BeanFactory 准备各个变量
- 实例化并调用所有已注册的
postProcessBeanFactory,扫描并向容器中注册 Bean。(自动装配的入口)(invokeBeanFactoryPostProcessors()) - 从 BeanFactory 中找出 Bean 后处理器(
beanPostProcessor),并设置到 BeanFactory 的属性中,之后 Bean 被实例化的时候会调用这个 BeanPostProcessor。 - 初始化国际化工具
- 初始化事件广播器
- 把监听器注册到事件广播器中
- 实例化容器中的Bean(非延迟单例 Bean)(
finishBeanFactoryInitialzation()) - 上下文刷新完毕,发布相应的事件
- 执行启动后的处理逻辑(实现
ApplicationRunner或者CommandLineRunner接口)

参考文档
- SpringBoot启动流程——文字描述
- Spring boot 启动流程分析(1)——代码
- —— refresh方法解析
