本文共 946字,阅读大约须要 3分钟 !spring
说到接触 SpringBoot 伊始,给我第一映像最深的是有两个关键元素:bash
对照上面的典型代码,这个两个元素分别是:markdown
关于 @SpringBootApplication 注解的剖析已经在上文:《SpringBoot 中 @SpringBootApplication注解背后的三体结构探秘》 中完成了,其实它背后就是一个三体结构,只是 SpringBoot给了其一个包装而已。那么本文咱们就来看看这个 SpringApplication 以及 run() 方法 究竟是个什么鬼,它背后又隐藏了哪些奥秘呢?app
注: 本文首发于 My Personal Blog,欢迎光临 小站框架
本文内容脑图以下:oop
SpringApplication 这个类应该算是 SpringBoot 框架 的“创新”产物了,原始的 Spring中并无这个类,SpringApplication 里面封装了一套 Spring 应用的启动流程,然而这对用户彻底透明,所以咱们上手 SpringBoot 时感受简洁、轻量。学习
通常来讲默认的 SpringApplication 执行流程已经能够知足大部分需求,可是 若用户想干预这个过程,则能够经过 SpringApplication 在流程某些地方开启的 扩展点 来完成对流程的扩展,典型的扩展方案那就是使用 set 方法。spa
咱们来举一个栗子,把咱们每天司空见惯的 SpringBoot 应用的启动类来拆解一下写出来:code
@SpringBootApplication
public class CodeSheepApplication {
public static void main( String[] args ) {
// SpringApplication.run( CodeSheepApplication.class args ); // 这是传统SpringBoot应用的启动,一行代码搞定,内部默认作了不少事
SpringApplication app = new SpringApplication( CodeSheepApplication.class );
app.setXXX( ... ); // 用户自定的扩展在此 !!!
app.run( args );
}
}
复制代码
这样一拆解后咱们发现,咱们也须要先构造 SpringApplication 类对象,而后调用该对象的 run()
方法。那么接下来就讲讲 SpringApplication 的构造过程 以及其 run()
方法的流程,搞清楚了这个,那么也就搞清楚了SpringBoot应用是如何运行起来的!orm
咱们对照代码来看:
四个关键的步骤已标注在图中,分别解释以下:
SpringFactoriesLoader
查找并加载 classpath下 META-INF/spring.factories
文件中全部可用的 ApplicationContextInitializer
SpringFactoriesLoader
查找并加载 classpath下 META-INF/spring.factories
文件中的全部可用的 ApplicationListener
先看看代码长啥样子:
各个主要步骤我已经标注在上图之中了,除此以外,我也按照本身的理解画了一个流程图以下所示,能够对照数字标示看一下:
咱们将各步骤总结精炼以下:
经过 SpringFactoriesLoader
加载 META-INF/spring.factories
文件,获取并建立 SpringApplicationRunListener
对象
而后由 SpringApplicationRunListener
来发出 starting 消息
建立参数,并配置当前 SpringBoot 应用将要使用的 Environment
完成以后,依然由 SpringApplicationRunListener
来发出 environmentPrepared 消息
建立 ApplicationContext
初始化 ApplicationContext
,并设置 Environment,加载相关配置等
由 SpringApplicationRunListener
来发出 contextPrepared
消息,告知SpringBoot 应用使用的 ApplicationContext
已准备OK
将各类 beans 装载入 ApplicationContext
,继续由 SpringApplicationRunListener
来发出 contextLoaded 消息,告知 SpringBoot 应用使用的 ApplicationContext
已装填OK
refresh ApplicationContext,完成IoC容器可用的最后一步
由 SpringApplicationRunListener
来发出 started 消息
完成最终的程序的启动
由 SpringApplicationRunListener
来发出 running 消息,告知程序已运行起来了
至此,全流程结束!
因为能力有限,如有错误或者不当之处,还请你们批评指正,一块儿学习交流!
可 长按 或 扫描 下面的 当心心 来订阅做者公众号 CodeSheep,获取更多 务实、能看懂、可复现的 原创文 ↓↓↓