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 消息,告知程序已运行起来了
至此,全流程结束!

来源:蛙课网

作者:I代码

原文:Spring Boot 应用程序启动流程分析

springboot中获得app_Spring Boot 应用程序启动流程分析相关推荐

  1. Spring Boot 应用程序启动流程分析

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

  2. Android中ICS4.0源码Launcher启动流程分析【android源码Launcher系列一】

    最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程.Launcher其实是贯彻于手机的整个系统的,时时刻刻都在 ...

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

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

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

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

  5. spring boot 启动流程分析

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

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

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

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

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

  8. Alian解读SpringBoot 2.6.0 源码(四):启动流程分析之应用环境准备

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.应用环境准备 2.1.准备环境的整体流程 2.2.创建环境 2.3.配置环境 2.3.1.注册默认的转换器.格式化组件 2.3.1 ...

  9. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

最新文章

  1. python使用input函数时、必须添加提示文字-Python中使用 input 函数来获取输入
  2. memory align
  3. Vue中使用Openlayers加载Geoserver发布的TileWMS
  4. AcWing 211. 计算系数
  5. 使用一些可选的将字符串配置属性转换为其他类型
  6. Delphi利用Windows GDI实现文字倾斜
  7. linux脚本怎么退出while,linux中的while命令
  8. Boring Old Menu Bar for Mac(Big Sur菜单栏优化工具)
  9. aes解密流程图_AES加密算法详解
  10. 360linux如何卸载,卸载360安全卫士方法
  11. HTTP请求方法及幂等性
  12. python是高级语言还是低级语言_作为一名程序员必需知道的术语:高级/低级语言?解释/编译语言?...
  13. android端使用百度地图
  14. adb命令——简单常用命令介绍:将文件从手机上传输到电脑里:adb pull /sdcard/123.png c:\users\del\desktop...
  15. 浅析GPU通信技术(上)-GPUDirect P2P
  16. [软件测试]软件测试的原则及软件质量
  17. 【学习】关于网站中图片的各类交互
  18. 前端Vue中实现超炫酷动态背景(全屏背景+自定义banner+登录/注册页)
  19. UVA 1600 巡逻机器人
  20. PS打开psd文件后黑屏

热门文章

  1. 如何屏蔽Canvas指纹跟踪
  2. haproxy Starting proxy XXX: cannot bind socket
  3. tomcat启动之后,Chrome浏览器可以访问,IE不行(IE无法访问8080 端口)
  4. linux 权限管理命令chown、chgrp、umask、linux新建文件或目录的默认权限755
  5. InfluxDB学习之InfluxDB的安装和简介
  6. 函数式编程(4)-装饰器
  7. git 查看、创建、切换、删除、重命名和推送分支
  8. 查询语句的练习45道题
  9. Django-Model操作数据库(增删改查、连表结构)
  10. Apache Arrow 内存数据