前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Spring Boot 应用程序启动流程分析

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

原创
作者头像
动力节点Java培训
修改2019-01-21 17:02:39
修改2019-01-21 17:02:39
85600
代码可运行
举报
文章被收录于专栏:Java学习资料Java学习资料
运行总次数:0
代码可运行

SpringBoot 有两个关键元素:

@SpringBootApplication SpringApplication 以及 run() 方法

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

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

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

代码语言:javascript
代码运行次数:0
复制
@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 消息,告知程序已运行起来了

至此,全流程结束!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档