SpringBoot 有两个关键元素:

@SpringBootApplication
SpringApplication 以及 run() 方法

SpringApplication 这个类应该算是 Spring Boot 框架的“创新”产物了,原始的 Spring 中并没有这个类,SpringApplication 中封装了一套 Spring 应用的启动流程,然而这对用户完全透明,因此我们上手 Spring Boot 时感觉很简洁、轻量。

一般来说默认的 SpringApplication 执行流程已经可以满足大部分需求,但是若用户想干预这个过程,则可以通过 SpringApplication 在流程某些地方开启扩展点来完成对流程的扩展,典型的扩展方案那就是使用 set 方法。

比如,把我们天天司空见惯的 Spring Boot 应用的启动类来拆解一下写出来就是这样:

@SpringBootApplication
public class CodeSheepApplication {public static void main( String[] args ) {//SpringApplication.run( CodeSheepApplication.class args ); SpringApplication app = new SpringApplication( CodeSheepApplication.class );app.setXXX( ... ); // 用户自定的扩展在此 !!!app.run( args );}
}

这样一拆解后我们发现,我们也需要先构造 SpringApplication 类对象,然后调用该对象的 run() 方法。那么接下来就讲讲 SpringApplication 的构造过程 以及其 run() 方法的流程,搞清楚了这个,那么也就搞清楚了SpringBoot应用是如何运行起来的!

SpringApplication 实例的初始化
我们对照代码来看:

四个关键的步骤已标注在图中,分别解释如下:

① 推断应用的类型:创建的是 REACTIVE应用、SERVLET应用、NONE 三种中的某一种

② 使用 SpringFactoriesLoader查找并加载 classpath下 META-INF/spring.factories文件中所有可用的 ApplicationContextInitializer

③ 使用 SpringFactoriesLoader查找并加载 classpath下 META-INF/spring.factories文件中的所有可用的 ApplicationListener

④ 推断并设置 main方法的定义类

SpringApplication 的run()方法探秘
先看看代码长啥样子:

各个主要步骤我已经标注在上图之中了,除此之外,我也按照自己的理解画了一个流程图如下所示,可以对照数字标示看一下:

我们将各步骤总结精炼如下:

1、通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件,获取并创建 SpringApplicationRunListener 对象

2、然后由 SpringApplicationRunListener 来发出 starting 消息

3、创建参数,并配置当前 SpringBoot 应用将要使用的 Environment

4、完成之后,依然由 SpringApplicationRunListener 来发出 environmentPrepared 消息

5、创建 ApplicationContext

6、初始化 ApplicationContext,并设置 Environment,加载相关配置等

7、由 SpringApplicationRunListener 来发出 contextPrepared 消息,告知SpringBoot 应用使用的 ApplicationContext 已准备OK

8、将各种 beans 装载入 ApplicationContext,继续由 SpringApplicationRunListener 来发出 contextLoaded 消息,告知 SpringBoot 应用使用的 ApplicationContext 已装填OK

9、refresh ApplicationContext,完成IoC容器可用的最后一步

10、由 SpringApplicationRunListener 来发出 started 消息

11、完成最终的程序的启动

12、由 SpringApplicationRunListener 来发出 running 消息,告知程序已运行起来了

至此,全流程结束!

Spring Boot 应用程序启动流程分析相关推荐

  1. springboot中获得app_Spring Boot 应用程序启动流程分析

    SpringBoot 有两个关键元素: @SpringBootApplication SpringApplication 以及 run() 方法 SpringApplication 这个类应该算是 S ...

  2. spring boot 启动流程分析

    spring boot 框架凭借极简配置,一键运行和强大的第三方框架集成等特点,受到广大开发者的青睐,基本成为java开发中必不可少的基础的框架.spirng boot带给我们这么多便利的背后,它都做 ...

  3. Spring Boot 2.x 启动全过程源码分析(全)

    上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我 ...

  4. Spring Boot 2.x 启动全过程源码分析(上)入口类剖析

    转载自   Spring Boot 2.x 启动全过程源码分析(上)入口类剖析 Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boo ...

  5. SpringBoot(十二)启动流程分析之创建应用上下文AnnotationConfigServletWebServerApplicationContext

    SpringBoot版本:2.1.1      ==>启动流程分析汇总 接上篇博客Spring Boot 2.1.1(十一)启动流程分析之设置系统属性spring.beaninfo.ignore ...

  6. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(中)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.调用后处理器 2.1.调用在上下文中注册为beanFactory的后置处理器 2.2.invokeBeanFactoryPostP ...

  7. Alian解读SpringBoot 2.6.0 源码(六):启动流程分析之创建应用上下文

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.创建应用上下文 2.1.初始化入口 2.2.初始化AbstractApplicationContext 2.3.初始化Generi ...

  8. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(下)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.初始化特定上下文子类中的其他特殊bean 2.1.初始化主体资源 2.2.创建web服务 三.检查监听器bean并注册它们 四.实 ...

  9. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(上)

    目录 一.背景 1.1.run方法整体流程 1.2.刷新的整体调用流程 1.3.本文解读范围 二.准备刷新 2.1.准备刷新的流程 2.2.初始化上下文环境中servlet相关属性源 2.3.校验re ...

最新文章

  1. PAT 1037 在霍格沃茨找零钱(20)(代码+思路)
  2. split | notes in java
  3. Android线程池详解
  4. 聊聊自驱团队的构建(四)
  5. GPUImage – 亮度平均 GPUImageLuminosity
  6. sql server与java实例_史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)
  7. 【mobile】安卓图案解锁尝试次数过多导致 要解锁需要GOOGLE账户登录,解决方案...
  8. 关于ExtJS错误“例外被抛出且未被接住”
  9. QT 5.9.5的快捷键操作
  10. 搭建hexo个人网站小试
  11. AddressBook通讯录右边索引条
  12. 函数连续、可导、可微、连续可微
  13. Linux系统下搭建DNS服务器——原理总结
  14. 筱筱看博客(简易的 loading 封装)
  15. 半波对称振子方向图_对称振子阵列天线.ppt
  16. c语言如何实现人民币转换编程,C语言成序设计实现人民币小写金额与大写金额的转换.docx...
  17. 为Android 模拟器加速
  18. 关于未名湖边的烦恼问题
  19. vue watch监听数据解决新旧值一样的问题(newValue, oldValue)
  20. 南京大学本科、斯坦福博士、化学奥赛金牌得主 王庆根 人生反思

热门文章

  1. git下载指定分支代码到本地
  2. 数据库实时转移之Confluent介绍(一)
  3. pg GUI Tools
  4. Qtopia-2.2.0 的配置和交叉编译
  5. app后端设计(12)--图片的处理
  6. Word画线条5大技巧,简单实用!
  7. 解决Win8.1系统LYNC共享PPT提示“演示文稿遇到问题”
  8. android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)...
  9. 写在Silverlight 5发布前 - 盘点2010年Silverlight开发书籍
  10. spring框架实现一个学生管理系统