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方法解析