SpringBoot启动过程源码解析

SpringBoot启动过程

创建SpringApplication流程

主程序类会调用SpringApplication.run()方法创建一个SpringApplication
在这里插入图片描述
在这里插入图片描述
传入主程序类,SpringApplication调用有参构造器,初始化相关的属性。
SpringBoot启动过程源码解析_第1张图片
然后还判断当前应用的类型
SpringBoot启动过程源码解析_第2张图片
获取SpringApplication的一些应用初始化器
SpringBoot启动过程源码解析_第3张图片
获取一些应用监听器
SpringBoot启动过程源码解析_第4张图片
判断哪个是主程序类,会从堆栈中找到包含main方法的那个类
SpringBoot启动过程源码解析_第5张图片SpringBoot启动过程源码解析_第6张图片

运行SpringApplication

SpringApplication被创建出来之后,就会调用run()方法运行创建出来的SpringApplication

  1. 首先创建出一个StopWatch并运行,用来记录应用的启动时间
    SpringBoot启动过程源码解析_第7张图片

  2. 获取所有的SpringApplicationRunListener运行监听器,并运行这些监听器
    SpringBoot启动过程源码解析_第8张图片
    getRunListeners()方法调用getSpringFactoriesInstances()方法,去spring.factories文件找到SpringApplicationRunListener,来获取所有的运行监听器
    在这里插入图片描述
    listeners.starting()方法会遍历所有SpringApplicationRunListener并执行监听器的starting()方法
    SpringBoot启动过程源码解析_第9张图片

  3. 保存命令行参数
    SpringBoot启动过程源码解析_第10张图片

  4. 调用prepareEnvironment()方法准备环境信息
    SpringBoot启动过程源码解析_第11张图片
    prepareEnvironment()方法首先调用getOrCreateEnvironment()方法返回或者创建基础环境信息对象
    SpringBoot启动过程源码解析_第12张图片
    读取所有配置源的配置属性值,来配置环境信息对象
    SpringBoot启动过程源码解析_第13张图片
    配置完属性之后,会绑定环境信息
    SpringBoot启动过程源码解析_第14张图片
    调用listeners.environmentPrepared(environment)方法,通知所有的监听器当前环境准备完成
    SpringBoot启动过程源码解析_第15张图片
    准备工作完成之后,返回这个环境信息对象
    SpringBoot启动过程源码解析_第16张图片

  5. 环境准备完成之后,就会调用createApplicationContext()方法创建出IOC容器
    SpringBoot启动过程源码解析_第17张图片
    createApplicationContext()方法会根据当前项目类型创建容器
    SpringBoot启动过程源码解析_第18张图片

  6. 调用prepareContext()方法准备IOC容器的环境信息,传入创建的ioc对象,环境信息对象,监听器和参数信息等

    SpringBoot启动过程源码解析_第19张图片
    首先保存基础环境信息
    SpringBoot启动过程源码解析_第20张图片
    调用postProcessApplicationContext()方法执行IOC容器后置处理流程
    SpringBoot启动过程源码解析_第21张图片
    调用applyInitializers()方法,来应用在SpringApplication创建过程中创建出来的所有的初始化器
    SpringBoot启动过程源码解析_第22张图片
    遍历所有的ApplicationContextInitializer,调用initialize()方法,来对ioc容器进行初始化扩展
    SpringBoot启动过程源码解析_第23张图片
    应用完初始化器之后,调用listeners.contextPrepared(context)来通知所有的监听器IOC容器上下文环境已经准备完成
    SpringBoot启动过程源码解析_第24张图片
    IOC准备完后,调用Load()方法加载IOC容器,并调用contextLoaded()方法通知所有的监听器IOC容器已加载完成
    SpringBoot启动过程源码解析_第25张图片

  7. IOC容器准备工作完成之后,调用refreshContext()方法刷新容器
    SpringBoot启动过程源码解析_第26张图片
    底层实际上调用的是Spring的IOC容器创建启动流程的刷新方法,来创建出容器中的所有组件
    在这里插入图片描述

  8. 容器刷新完成之后调用afterRefresh()方法,执行相关的后续流程
    SpringBoot启动过程源码解析_第27张图片

  9. 调用stopWatch.stop(),应用全部启动完成,记录花费了多少时间
    SpringBoot启动过程源码解析_第28张图片

  10. 所有监听器调用startered方法,通知所有监听器项目已经启动完成
    SpringBoot启动过程源码解析_第29张图片

  11. 调用callRunners方法,获取容器中的ApplicationRunnerCommandLineRunner
    SpringBoot启动过程源码解析_第30张图片
    合并所有的runner并且按照@Order进行排序
    SpringBoot启动过程源码解析_第31张图片
    遍历所有的runner调用run()方法
    SpringBoot启动过程源码解析_第32张图片
    SpringBoot启动过程源码解析_第33张图片

  12. 如果以上流程出现异常,就会捕获异常,调用handleRunFailure()方法执行监听器的failed方法
    SpringBoot启动过程源码解析_第34张图片SpringBoot启动过程源码解析_第35张图片

  13. 如果没有出现异常,就会调用listeners.running(context),通知所有的监听器应用正常运行,如果运行也有异常,也会进行捕获处理
    SpringBoot启动过程源码解析_第36张图片

  14. 最后返回IOC容器
    SpringBoot启动过程源码解析_第37张图片
    在这里插入图片描述

你可能感兴趣的:(SpringBoot2,SpringBoot,启动过程)