【微服务专题】Spring启动过程源码解析

前言

这部分只是个人的自结,方便后面回来看源码的时候跟踪,个人感觉看完之后没什么需要特别学习的地方,源码复杂不说,注释也没多少,真的全凭个人功力了。另外,也可能是我对SpringBoot的使用还不是很熟悉吧,所以才会觉得吃力。大家绕道走吧

阅读对象

  1. 有SpringBoot使用经验的朋友
  2. 了解什么是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会把:

  1. 从命令行中
  2. 从jvm设置参数中
  3. 从系统环境变量中
  4. 从配置文件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事件

学习总结

感谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

验证码有毒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值