SpringApplication对象是如何构建的? SpringBoot源码(八)
源码笔记 人气:0
**注:该源码分析对应SpringBoot版本为2.1.0.RELEASE**
本篇接 [SpringBoot的启动流程是怎样的?SpringBoot源码(七)](https://juejin.im/post/5e771657f265da574c569be1)
# 1 温故而知新
温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了**SpringBoot的启动流程**,现将关键步骤再浓缩总结下:
1. 构建`SpringApplication`对象,用于启动SpringBoot;
2. 从`spring.factories`配置文件中加载`EventPublishingRunListener`对象用于在不同的启动阶段发射不同的生命周期事件;
3. 准备环境变量,包括系统变量,环境变量,命令行参数及配置文件(比如`application.properties`)等;
4. 创建容器`ApplicationContext`;
5. 为第4步创建的容器对象做一些初始化工作,准备一些容器属性值等,同时调用各个`ApplicationContextInitializer`的初始化方法来执行一些初始化逻辑等;
6. 刷新容器,这一步至关重要,是重点中的重点,太多复杂逻辑在这里实现;
7. 调用`ApplicationRunner`和`CommandLineRunner`的run方法,可以实现这两个接口在容器启动后来加载一些业务数据等;
在SpringBoot启动过程中,每个不同的启动阶段会分别发射不同的内置生命周期事件,然后相应的监听器会监听这些事件来执行一些初始化逻辑工作比如`ConfigFileApplicationListener`会监听`onApplicationEnvironmentPreparedEvent`事件来加载环境变量等。
# 2 引言
上篇文章在讲解SpringBoot的启动流程中,我们有看到新建了一个`SpringApplication`对象用来启动SpringBoot项目。那么,我们今天就来看看`SpringApplication`对象的构建过程,同时讲解一下SpringBoot自己实现的SPI机制。
# 3 SpringApplication对象的构建过程
本小节开始讲解`SpringApplication`对象的构造过程,因为一个对象的构造无非就是在其构造函数里给它的一些成员属性赋值,很少包含其他额外的业务逻辑(当然有时候我们可能也会在构造函数里开启一些线程啥的)。那么,我们先来看下构造`SpringApplication`对象时需要用到的一些成员属性哈:
```java
// SpringApplication.java
/**
* SpringBoot的启动类即包含main函数的主类
*/
private Set
加载全部内容