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

目录

  • 前言
  • 阅读对象
  • 阅读导航
  • 前置知识
  • 笔记正文
    • 一、SpringBoot启动过程源码解析
      • 1.1 SpringBoot启动过程源码流程图
      • 1.2 流程解析补充
        • 1.2.1 SpringApplicationRunListeners:SpringBoot运行过程监听器
  • 学习总结
  • 感谢

前言

这部分只是个人的自结,方便后面回来看源码的时候跟踪,个人感觉看完之后没什么需要特别学习的地方,源码复杂不说,注释也没多少,真的全凭个人功力了。另外,也可能是我对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.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
      <version>2.6.4version>
    dependency>

OK,先来一个业务流程图。

1.1 SpringBoot启动过程源码流程图

【微服务专题】Spring启动过程源码解析_第1张图片

想看流程图的朋友,可以对图片右键-》新标签页打开… 这样才会比较清晰

总结完之后,我的想法只有一个,这个源码挺复杂的,没啥必要看了,注释还少,哈哈。
当然也不是没有任何要总结的,多少学习了一点东西吧

1.2 流程解析补充

1.2.1 SpringApplicationRunListeners:SpringBoot运行过程监听器

顾名思义,这个是SpringBoot提供的,用来监听SpringBoot启动过程的监听器接口。它会在某些特定的节点,换句话说:比较明显的流程切换节点,调用监听器接口对应的回调方法。回调接口如下图:
【微服务专题】Spring启动过程源码解析_第2张图片
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事件

学习总结

感谢

你可能感兴趣的:(Java,tuling学院学习笔记,spring,spring,boot)