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 运行器


 

执行所有 ApplicationRunnerCommandLineRunner 这两种运行器,不详细展开了。

17、发布应用上下文就绪事件


触发所有 SpringApplicationRunListener 监听器的 running 事件方法。

18、返回应用上下文

总结

Spring Boot 的启动全过程源码分析至此,分析 Spring 源码真是一个痛苦的过程,希望能给大家提供一点参考和思路,也希望能给正在 Spring Boot 学习路上的朋友一点收获。

 

posted @ 2019-04-29 16:21  Hanyancy  阅读(180)  评论(0)    收藏  举报