当前位置: 首页 > news >正文

【微服务专题】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.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事件

学习总结

感谢

相关文章:

  • 【Java并发编程三】线程的基本使用一
  • 论信息系统项目的沟通管理
  • Debian/Ubuntu 安装 NodeJS【详细步骤】
  • 设计模式-创建型模式-单例模式
  • C++ 继承和派生
  • JAXB的XmlElement注解
  • 紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板
  • RabbitMQ 部署及配置详解(集群部署)
  • VB.net WebBrowser网页元素抓取分析方法
  • HMM与LTP词性标注之依存句法分析、词性标注实现
  • 在国内购买GPT服务前的一定要注意!!!
  • Git企业开发级讲解(五)
  • 操作系统(存储管理进程管理设备管理)
  • WPF中行为与触发器的概念及用法
  • 前端算法面试之堆排序-每日一练
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【RocksDB】TransactionDB源码分析
  • export和import的用法总结
  • IOS评论框不贴底(ios12新bug)
  • JavaScript对象详解
  • nginx 配置多 域名 + 多 https
  • python docx文档转html页面
  • React 快速上手 - 07 前端路由 react-router
  • spring boot 整合mybatis 无法输出sql的问题
  • 反思总结然后整装待发
  • 基于Android乐音识别(2)
  • 计算机常识 - 收藏集 - 掘金
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 一起参Ember.js讨论、问答社区。
  • 移动端唤起键盘时取消position:fixed定位
  • 从如何停掉 Promise 链说起
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (算法)求1到1亿间的质数或素数
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [.net]官方水晶报表的使用以演示下载
  • [Android学习笔记]ScrollView的使用
  • [AR]Vumark(下一代条形码)
  • [c++] C++多态(虚函数和虚继承)
  • [cb]UIGrid+UIStretch的自适应
  • [CodeForces-759D]Bacterial Melee
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [JavaScript]如何讓IE9, IE8, IE7, IE6關閉視窗時不彈出對話訊息
  • [JavaWeb学习] tomcat简介、安装及项目部署
  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  • [moka同学笔记]yii表单dropdownlist样式
  • [Mvc]在ASP.NET MVC中使用Repeater