Spring Boot启动流程

SpringApplication.run(SpringBootLearnApplication.class, args);该方法包含了两大步骤:
一、new SpringApplication 对象

  1. 配置资源
  2. 判断是否为Web环境
  3. 设置初始化构造器和监听器(通过getSpringFactoriesInstances方法,获取指定路径下的 META-INF/spring.factories 文件中指定类的实例,ApplicationContextInitializerApplicationListener
  4. 推断应用程序主类(指 SpingBoot 项目的启动类)

二、 运行 SpringApplication#run 方法

  1. 获取监听器并启动(通过getSpringFactoriesInstances方法获取SpringApplicationRunListener
  2. 准备容器运行环境(配置Web环境)
  3. 创建应用程序上下文 (SERVLET 类型为例,它会创建AnnotationConfigServletWebServerApplicationContext应用上下文实例)
  4. 准备上下文(给上下文赋值,获取所有配置源信息,加载 Spring 应用上下文配置源,将 BeanDefinition 加载到 context 中,发布上下文已准备事件)
  5. 刷新上下文,进行初始化流程(refresh()
    1. 刷新容器前的准备工作,设置参数和验证必须属性
    2. 获取 BeanFactory,为 BeanFactory 准备各个变量
    3. 实例化并调用所有已注册的postProcessBeanFactory,扫描并向容器中注册 Bean。(自动装配的入口)(invokeBeanFactoryPostProcessors()
    4. 从 BeanFactory 中找出 Bean 后处理器(beanPostProcessor),并设置到 BeanFactory 的属性中,之后 Bean 被实例化的时候会调用这个 BeanPostProcessor。
    5. 初始化国际化工具
    6. 初始化事件广播器
    7. 把监听器注册到事件广播器中
    8. 实例化容器中的Bean(非延迟单例 Bean)(finishBeanFactoryInitialzation()
    9. 上下文刷新完毕,发布相应的事件
  6. 执行启动后的处理逻辑(实现ApplicationRunner或者 CommandLineRunner接口)

Spring Boot启动流程 - 图1

参考文档

  1. SpringBoot启动流程——文字描述
  2. Spring boot 启动流程分析(1)——代码
  3. —— refresh方法解析