SpringBoot 应用程序启动过程探秘

SpringBoot - SpringBoot手写模拟SpringBoot启动过程 MyApplication是Spring的一个配置类,但是MyApplication是我们传递给SpringBoot,从而添加到 Spring容器中去的,而WebServiceAutoConfiguration就需要SpringBoot去自动发现,而不需要程 序员做任何配置才能把它添加到Spring容器中去,而且要注意的是,Spring容器扫描也是扫描不到 WebServiceAutoConfiguration这个类的,因为我们的扫描路径是"com.zhouyu.user",而。 阅读详情

概述

说到接触 SpringBoot 伊始,给我第一映像最深的是有两个关键元素:

13467292-83306bd9868bf419

对照上面的典型代码,这个两个元素分别是:

@SpringBootApplication

SpringApplication 以及 run() 方法

关于 @SpringBootApplication 注解的剖析已经在上文:《SpringBoot 中 @SpringBootApplication注解背后的三体结构探秘》 中完成了,其实它背后就是一个三体结构,只是 SpringBoot给了其一个包装而已。那么本文我们就来看看这个 SpringApplication 以及 run() 方法 到底是个什么鬼,它背后又隐藏了哪些奥秘呢?

注: 本文首发于 My Personal Blog,欢迎光临 小站

本文内容脑图如下:

13467292-2f4b4c3d645c365a

SpringApplication 惊鸿一瞥

SpringApplication 这个类应该算是 SpringBoot 框架 的“创新”产物了,原始的 Spring中并没有这个类,SpringApplication 里面封装了一套 Spring 应用的启动流程,然而这对用户完全透明,因此我们上手 SpringBoot 时感觉简洁、轻量。

一般来说默认的 SpringApplication 执行流程已经可以满足大部分需求,但是 若用户想干预这个过程,则可以通过 SpringApplication 在流程某些地方开启的 扩展点 来完成对流程的扩展,典型的扩展方案那就是使用 set 方法。

我们来举一个栗子,把我们天天司空见惯的 SpringBoot 应用的启动类来拆解一下写出来:

@SpringBootApplicationpublicclassCodeSheepApplication{publicstaticvoidmain( String[] args ) {// SpringApplication.run( CodeSheepApplication.class args ); // 这是传统SpringBoot应用的启动,一行代码搞定,内部默认做了很多事SpringApplication app =newSpringApplication( CodeSheepApplication.class);app.setXXX( ... );// 用户自定的扩展在此 !!!app.run( args );}}复制代码

这样一拆解后我们发现,我们也需要先构造 SpringApplication 类对象,然后调用该对象的 run() 方法。那么接下来就讲讲 SpringApplication 的构造过程 以及其 run() 方法的流程,搞清楚了这个,那么也就搞清楚了SpringBoot应用是如何运行起来的!

SpringApplication 实例的初始化

我们对照代码来看:

13467292-c4bd42ae31af0ca4

四个关键的步骤已标注在图中,分别解释如下:

① 推断应用的类型:创建的是 REACTIVE应用、SERVLET应用、NONE 三种中的某一种

13467292-c49f187b3a76e2c7

② 使用 SpringFactoriesLoader查找并加载 classpath下 META-INF/spring.factories文件中所有可用的 ApplicationContextInitializer

13467292-a3ad2ba9d64482ee

③ 使用 SpringFactoriesLoader查找并加载 classpath下 META-INF/spring.factories文件中的所有可用的 ApplicationListener

13467292-9c0d94819de81e4c

④ 推断并设置 main方法的定义类

13467292-108db6b5091cc8ec

SpringApplication 的run()方法探秘

先看看代码长啥样子:

13467292-d3dd6f52deebd0ba

各个主要步骤我已经标注在上图之中了,除此之外,我也按照自己的理解画了一个流程图如下所示,可以对照数字标示看一下:

13467292-a1ffd3bbd9d3c87d

我们将各步骤总结精炼如下:

通过 SpringFactoriesLoader 加载 META-INF/spring.factories 文件,获取并创建 SpringApplicationRunListener 对象

然后由 SpringApplicationRunListener 来发出 starting 消息

创建参数,并配置当前 SpringBoot 应用将要使用的 Environment

完成之后,依然由 SpringApplicationRunListener 来发出 environmentPrepared 消息

创建 ApplicationContext

初始化 ApplicationContext,并设置 Environment,加载相关配置等

由 SpringApplicationRunListener 来发出 contextPrepared 消息,告知SpringBoot 应用使用的 ApplicationContext 已准备OK

将各种 beans 装载入 ApplicationContext,继续由 SpringApplicationRunListener 来发出 contextLoaded 消息,告知 SpringBoot 应用使用的 ApplicationContext 已装填OK

refresh ApplicationContext,完成IoC容器可用的最后一步

由 SpringApplicationRunListener 来发出 started 消息

完成最终的程序的启动

由 SpringApplicationRunListener 来发出 running 消息,告知程序已运行起来了

至此,全流程结束!

Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费学习加群:835638062 点击链接加入群聊【Java高级架构】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

Spring Boot的启动流程 - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 创建springbootApplication对象 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - 1. 创建springbootApplication对象springboot容器初始化操作 2. 获取当前应用的启动类型。2.1 :通过判断当前classpath是否加载servlet类,返回servlet web启动方式。 阅读详情

相关推荐

第1关:STL模板之queue实例一:最少个数

头歌自创答案

xiyunSacire的博客 819

总结:Springboot启动流程

一、总结 1、关于SpringApplication SpringBoot的启动主要是通过实例化SpringApplication来启动的。 2、实例化SpringApplication时做了什么? SpringApplication的构造方法做了几件事情: 推断WebApplicationType,主要思想就是在当前的classpath下搜索特定的类 搜索META-INF\spring.factories文件配置的ApplicationContextInitializer的实现类 搜索MET

w2009211777的专栏 1万+

告别OpenAI API调用:手把手在本地CPU/GPU上部署fast-whisper中文语音识别模型

本文详细指导如何在本地CPU/GPU上部署fast-whisper中文语音识别模型,摆脱对OpenAI API的依赖。从环境准备、模型获取与优化,到CPU/GPU环境的具体部署步骤和性能优化技巧,全面覆盖本地化语音识别的实现方案,帮助开发者提升效率并保障数据隐私。

weixin_29988907的博客 309

Spring Boot启动流程

自定义初始化器首先要实现 ApplicationContextInitializer 接口执行自定义初始化器的方式有三种方式一:通过通过SpringApplication对象调用addInitializers(new 自定义初始化器)@Order(2)@Override方式二:通过META-INF/spring.factories中指定org.springframework.context.ApplicationContextInitializer=自定义初始化器。

quanzhan_King的博客 4765

STM32与小米CyberGear微电机的CAN通信协议深度解析

本文深度解析STM32与小米CyberGear微电机的CAN通信协议,涵盖硬件连接、CAN总线配置、通信协议解析及多电机协同控制。重点介绍了基于STM32的电机控制实践,包括运动模式、速度与位置模式设置,以及数据反馈与故障诊断,为机器人及自动化设备开发提供实用指南。

www00的博客 362

STM32与SD卡SPI接口硬件设计:从原理图到调试的完整指南

SPI(串行外设接口)作为一种广泛应用的同步串行通信协议,以其接线简单、驱动成熟的特点,成为连接微控制器与各类外设的经典方案。其工作原理基于主从架构,通过时钟、数据线和片选信号实现全双工通信,在嵌入式系统中具有极高的技术价值,常用于连接传感器、存储设备和显示模块等。在数据存储场景中,SD卡凭借其大容量和便携性成为首选,而通过SPI模式驱动SD卡,则平衡了性能与设计复杂度。本文聚焦于使用Altium Designer进行硬件设计的工程实践,详细解析了STM32微控制器与SD卡通过SPI通信时,电源管理、上拉电

weixin_34101784的博客 555

Springboot启动过程详解

Springboot启动过程详解

水w的博客 1万+

PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南

本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。

weixin_29229055的博客 552

SpringBoot的启动流程

​ springboot是依赖于spring的,比起spring,除了拥有spring的全部功能以外,springboot无需繁琐的xml配置,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty等web容器,集成了springmvc,使得springboot可以直接运行,不需要额外的容器,提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。 springboot 是一个服务于框架的框架,简化了spring的配置。

haylee的专栏 4688

京东云鼎环境配置与API安全接入实战:ISV服务商如何搞定数据加密与商家授权

本文详细介绍了京东云鼎环境配置与API安全接入的实战指南,帮助ISV服务商解决数据加密与商家授权等核心问题。通过京东开放平台的应用申请流程,结合多租户数据隔离策略和自动化授权实现,确保电商生态中的安全高效运营。文章还提供了避坑指南,助力开发者规避常见配置错误。

weixin_28705087的博客 353

【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC

案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou

「汽车电子助手」的博客 1698

SpringBoot启动过程

SpringBoot启动过程分析,首先打开SpringBoot的启用入口Main类: @SpringBootApplication public class ApplicationMain{ public static void main(String[] args) { SpringApplication.run(ApplicationMain.class, args);...

chengbinbbs的专栏 4万+

YOLOv8轻量化模型瘦身术:深度解析与实战LAMP剪枝 YOLOv8(2021)

YOLOv8模型LAMP剪枝技术解析与实战 本文深入探讨了LAMP剪枝技术在YOLOv8目标检测模型中的应用。针对深度学习模型部署面临的资源限制问题,LAMP剪枝通过最小化L2失真和层自适应稀疏度分配,实现了高效模型压缩。相比传统幅度剪枝的"一刀切"方法,LAMP创新性地将剪枝建模为优化问题,定义LAMP分数来衡量权重重要性,自动确定各层最佳剪枝率。文章从理论基础出发,详细解析了LAMP的核心数学公式和算法流程,并提供了完整的YOLOv8移植实战指南,包括代码结构、剪枝步骤和微调策略。通

FJN110的博客 2423

9千字长文带你了解SpringBoot启动过程–史上最详细 SpringBoot启动流程-图文并茂

9千字长文带你了解SpringBoot启动过程–史上最详细 SpringBoot启动流程-图文并茂

weixin_42113716的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringBoot:SpringBoot启动过程中这些事件你必须掌握

SpringBoot启动事件ApplicationStartingEvent ApplicationEnvironmentPreparedEvent ApplicationContextInitializedEvent 等介绍已经在项目中如何应用

永远保持随时离开的技术能力! 1991

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

springboot的启动过程介绍

1、记录一下Springboot启动过程,代码如下: @SpringBootApplication public class StartApplication { public static void main(String[] args) { SpringApplication.run(StartApplication.class , args ); System.out.println("finsh."); } } 2、以上的关键是注解 @Sprin

m0_48547368的博客 6131

SpringBoot 启动流程

方法来启动 Spring Boot 应用程序。该方法接受两个参数,第一个参数是启动类的类对象,第二个参数是主方法的参数。方法中做了一系列操作来完成项目启动所需的初始化Spring容器、启动内置tomcat、启动应用程序以及通知监听者等步骤。总的来说,Spring Boot的启动过程是一个复杂的流程,从启动类的Main方法中调用。启动类必须使用 @SpringBootApplication 注解标记该类。方法开始,然后在SpringApplication对象的。方法来执行项目启动的后续操作。

qq_33807380的博客 9554

【SpringBoot3】应用程序启动监听

应用启动监听在 Spring Boot 和其他框架中扮演着重要的角色。它们的主要作用是在应用启动或关闭时触发特定的操作或任务。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 2774

SpringBoot启动过程源码解析

默认情况下SpringBoot提供了一个EventPublishingRunListener,它实现SpringApplicationRunListener接口,默认情况下会利用EventPublishingRunListener发布一个ApplicationContextInitializedEvent事件,程序员可以通过定义ApplicationListener来消费这个事件。中传入进来的类,比如MyApplication.class,作为Spring容器的配置类。

野心与梦 2万+
上一篇: 编写高性能 Java 代码的最佳实践
下一篇: 深入剖析Redis - Redis集群模式搭建与原理详解
普通网友
博客等级 码龄8年 55粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值