目录
前言
这部分只是个人的自结,方便后面回来看源码的时候跟踪,个人感觉看完之后没什么需要特别学习的地方,源码复杂不说,注释也没多少,真的全凭个人功力了。另外,也可能是我对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 run方法创建一个Environment对象
如上图,在run
方法执行的第四步中,会创建一个Environment对象,然后设置到ApplicationContext
中(我的2.6.4 web环境中本质是ConfigurableEnvironment
对象)。
为什么要单独说这个,因为在源码中,Springboot会把:
- 从命令行中
- 从jvm设置参数中
- 从系统环境变量中
- 从配置文件
application.properties
中
读取到的配置项
,统统写入到这个Enviroment
对象中,这样,我们就可以在后续开发中,使用ApplicationContext
访问到他们了
1.2.2 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
事件
学习总结
感谢
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/180473.html