Spring Boot 2.x 启动全过程源码分析(下)
核心 run 方法。
SpringApplication 实例 run 方法运行过程

上面分析了 SpringApplication 实例对象构造方法初始化过程,下面继续来看下这个 SpringApplication 对象的 run 方法的源码和运行流程。
![]()



所以,我们可以按以下几步来分解 run 方法的启动过程。
1、创建并启动计时监控类

来看下这个计时监控类 StopWatch 的相关源码:

首先记录了当前任务的名称,默认为空字符串,然后记录当前 Spring Boot 应用启动的开始时间。
2、初始化应用上下文和异常报告集合

3、设置系统属性 `java.awt.headless` 的值

设置该默认值为:true,Java.awt.headless = true 有什么作用?

4、创建所有 Spring 运行监听器并发布应用启动事件

来看下创建 Spring 运行监听器相关的源码:

创建逻辑和之前实例化初始化器和监听器的一样,一样调用的是 getSpringFactoriesInstances 方法来获取配置的监听器名称并实例化所有的类。
SpringApplicationRunListener 所有监听器配置在 spring-boot-2.0.3.RELEASE.jar!/META-INF/spring.factories 这个配置文件里面。

5、初始化默认应用参数类

6、根据运行监听器和应用参数来准备 Spring 环境

下面我们主要来看下准备环境的 prepareEnvironment 源码:

6.1) 获取(或者创建)应用环境

这里分为标准 Servlet 环境和标准环境。
6.2) 配置应用环境

这里分为以下两步来配置应用环境。
- 配置 property sources
- 配置 Profiles
这里主要处理所有 property sources 配置和 profiles 配置。
7、创建 Banner 打印类

这是用来打印 Banner 的处理类,这个没什么好说的。
8、创建应用上下文
来看下 createApplicationContext() 方法的源码:

其实就是根据不同的应用类型初始化不同的上下文应用类。
9、准备异常报告器

逻辑和之前实例化初始化器和监听器的一样,一样调用的是 getSpringFactoriesInstances 方法来获取配置的异常类名称并实例化所有的异常处理类。
该异常报告处理类配置在 spring-boot-2.0.3.RELEASE.jar!/META-INF/spring.factories 这个配置文件里面。

10、准备应用上下文

来看下 prepareContext() 方法的源码:


11、刷新应用上下文

这个主要是刷新 Spring 的应用上下文,源码如下,不详细说明。

12、应用上下文刷新后置处理

看了下这个方法的源码是空的,目前可以做一些自定义的后置处理操作。

13、停止计时监控类


计时监听器停止,并统计一些任务执行信息。
14、输出日志记录执行主类名、时间信息

15、发布应用上下文启动完成事件

触发所有 SpringApplicationRunListener 监听器的 started 事件方法。
16、执行所有 Runner 运行器


执行所有 ApplicationRunner 和 CommandLineRunner 这两种运行器,不详细展开了。
17、发布应用上下文就绪事件

触发所有 SpringApplicationRunListener 监听器的 running 事件方法。
18、返回应用上下文
![]()
总结
Spring Boot 的启动全过程源码分析至此,分析 Spring 源码真是一个痛苦的过程,希望能给大家提供一点参考和思路,也希望能给正在 Spring Boot 学习路上的朋友一点收获。




浙公网安备 33010602011771号