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

目录

  • 前言
  • 阅读对象
  • 阅读导航
  • 前置知识
  • 笔记正文
    • 一、SpringBoot启动过程源码解析
      • 1.1 SpringBoot启动过程源码流程图
      • 1.2 流程解析补充
        • 1.2.1 SpringApplicationRunListeners: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事件

学习总结

感谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/180532.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【原创】java+swing+mysql个人日记管理系统设计与实现

摘要&#xff1a; 个人日记管理系统是一个可以记录、管理、存储和检索个人日记的应用程序。这个系统允许用户创建和管理多个日记帐户&#xff0c;每个帐户都可以有多个日记条目。用户可以随时添加、编辑或删除日记条目&#xff0c;并可以将这些条目按照主题或其他标准进行分类…

推介会如何做好媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式&#xff0c;旨在促进交流活动&#xff0c;形成合作&#xff0c;从而带来共同利益。推介会的本…

Mendix 创客访谈录|低代码赋能IoT应用开发

本期创客 郑锴 舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部 毕业于浙江大学&#xff0c;三年软件设计开发经验。目前任职于舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部&#xff0c;担任软件开发工程师&#xff0c;主要负责工业互联网相关软件…

Java医院绩效考核管理系统源码,设有手工录入功能(可以批量导入)

医院绩效考核系统以医院的发展战略为导向&#xff0c;把科室、员工的绩效考核跟战略发展目标紧密结合&#xff0c;引导医院各个科室、各员工的工作目标跟医院的发展目标结合在一起&#xff0c;实现医院的优化发展。系统提供灵活的绩效考评体系配置方案&#xff0c;支持不同科室…

开源博客项目Blog .NET Core源码学习(6:雪花算法)

Blog .NET项目中有多种数据类生成对象实例时需要唯一标识&#xff0c;一般做法要么使用GUID&#xff0c;也可以保存到数据库时使用数据库表的自增长ID&#xff0c;也可以自定义规则以确保产生不重复的唯一标识&#xff0c;而在Blog .NET项目中使用雪花算法生成唯一标识。   关…

Golang实现一个一维结构体,根据某个字段排序

package mainimport ("fmt""sort" )type Person struct {Name stringAge int }func main() {// 创建一个一维结构体切片people : []Person{{"Alice", 25},{"Bob", 30},{"Charlie", 20},{"David", 35},{"Eve…

深兰科技轮腿家用AI机器人荣获“2023年度城市更新科创大奖”

近日&#xff0c;“2023金砖论坛第五季金立方城市更新科创大会”在上海举行&#xff0c;会上发布了《第12届金砖价值榜》&#xff0c;深兰科技研发出品的轮腿式家用AI机器人(兰宝)&#xff0c;因其AI技术的创新性应用&#xff0c;荣获了“2023年度城市更新科创大奖”。 在10月2…

Go语言fyne开发桌面应用程序-环境安装

环境安装 参考https://developer.fyne.io/started/#prerequisites网站 之前的文章介绍了如何安装GO语言这里不在叙述 msys2 首先安装msys2&#xff0c;https://www.msys2.org/ 开始菜单打开MSYS2 执行 $ pacman -Syu$ pacman -S git mingw-w64-x86_64-toolchain注意&#…

香港科技大学广州|机器人与自主系统学域博士招生宣讲会—电子科技大学专场!!!(暨全额奖学金政策)

在机器人和自主系统领域实现全球卓越—机器人与自主系统学域 硬核科研实验室&#xff0c;浓厚创新产学研氛围&#xff01; 教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01; 一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; &#x1f559;时间&#xff1a;…

Winodws核心编程 多线程

目录 一、基本概念 二、线程创建函数 三、Windows内核对象与句柄 四、简单的多线程案例 五、线程同步 - 互斥对象 六、多线程实现群聊的服务端和客户端 七、线程同步 - 事件对象 八、事件对象 与 互斥对象区别 九、线程同步 - 信号量 十、线程同步 - 关键代码段 十一…

uniapp app tabbar 页面默认隐藏

1.在page.json 中找到tabbar visible 默认为true,设为false则是不显示 uni.setTabBarItem({ index: 1, //列表索引 visible:true //显示或隐藏 })

保驾“双十一” 博睿数据助力电商零售迎高峰无烦忧

如果说“双十一”大战的A面是由天猫、京东、拼多多、唯品会等电商平台&#xff0c;以及一些MCN机构、头部主播拉动的一系列购物狂潮&#xff0c;那么B面则是零售、物流、制造、银行保险等全产业链面对海量流量之下&#xff0c;以强大的心力、脑力与体力应对流量增加和交易陡增的…