目录
- 前言
- 阅读对象
- 阅读导航
- 前置知识
- 笔记正文
- 一、SpringBoot启动过程源码解析
- 1.1 SpringBoot启动过程源码流程图
- 1.2 流程解析补充
- 1.2.1 SpringApplicationRunListeners:SpringBoot运行过程监听器
- 学习总结
- 感谢
前言
这部分只是个人的自结,方便后面回来看源码的时候跟踪,个人感觉看完之后没什么需要特别学习的地方,源码复杂不说,注释也没多少,真的全凭个人功力了。另外,也可能是我对SpringBoot的使用还不是很熟悉吧,所以才会觉得吃力。大家绕道走吧
阅读对象
- 有SpringBoot使用经验的朋友
- 了解什么是SPI
阅读导航
系列上一篇文章:《【微服务专题】手写模拟SpringBoot》
前置知识
笔记正文
一、SpringBoot启动过程源码解析
本次源码启动的入口,就是下面这一段源码:
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class);}
}
然后我的SpringBoot依赖是:2.6.4
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.4</version></dependency>
OK,先来一个业务流程图。
1.1 SpringBoot启动过程源码流程图
想看流程图的朋友,可以对图片右键-》新标签页打开… 这样才会比较清晰
总结完之后,我的想法只有一个,这个源码挺复杂的,没啥必要看了,注释还少,哈哈。
当然也不是没有任何要总结的,多少学习了一点东西吧
1.2 流程解析补充
1.2.1 SpringApplicationRunListeners:SpringBoot运行过程监听器
顾名思义,这个是SpringBoot提供的,用来监听SpringBoot启动过程的监听器接口。它会在某些特定的节点,换句话说:比较明显的流程切换节点,调用监听器接口对应的回调方法。回调接口如下图:
SpringBoot提供了一个默认,该接口的实现类EventPublishingRunListener
(下面简称简单实现类
),下面我结合这个实现类简单介绍一下它的作用及表现:
starting()
:在run方法首次启动时立即调用。可以用于非常早期的初始化。简单实现类会在此发布一个ApplicationStartingEvent
事件environmentPrepared()
:在环境准备好之后调用,但在ApplicationContext创建之前调用。简单实现类会发布一个ApplicationEnvironmentPreparedEvent
事件
所谓环境准备好,是指参数、配置都已经加载完了,但是在Spring容器没有创建之前
contextPrepared()
:在ApplicationContext创建并准备好之后调用,但在加载源之前调用。简单实现类会发布一个ApplicationContextInitializedEvent
事件
只是创建、初始化了容器,但是还没有把参数、配置等装载到容器呢
contextLoaded()
:在ApplicationContext加载后但在刷新之前调用。简单实现类会发布一个ApplicationPreparedEvent
事件
装载参数了。但是这里还没开始调用Spring的refresh方法。有经验的朋友应该知道,在这里一个很显著的标志是,Spring还没开始创建bean呢。其实更深的来说,Spring容器还没开始工作呢
started()
:ApplicationContext已经刷新,应用程序已经启动,但是CommandLineRunners和ApplicationRunners还没有被调用。简单实现类会发布一个ApplicationStartedEvent
事件
这是一个比较重要的拓展点了。标志着Spring容器已经启动并且完成了所有工作,用户可以使用了。这个事件也是我们在SpringBoot开发中最常使用的一个,楼主我就喜欢在这里做拓展
ready()
:在run方法完成之前立即调用,此时ApplicationContext已经刷新,并且调用了所有CommandLineRunners和applicationrunner。简单实现类会发布一个ApplicationReadyEvent
事件failed()
:在运行应用程序时发生故障时调用。简单实现类会发布一个ApplicationFailedEvent
事件