SpringBoot启动原理--------run()方法详细讲解

SpringBoot运行流程源码分析:run方法流程及监听器 SpringBoot运行流程源码分析 上一章中我们分析了 SpringApplication 类实例化的源代码,在此过程中完成了基本配置文件的加载和实例化。当 SpringApplication 对象被创建之后, 通过调用其 run 方法来进行SpringBoot 的启动和运行,至此正式开启了 SpringApplication 的生命周期。 本章介绍的内容同样是 Spring Boot 运行的核心流程之一,我们将会围绕 SpringApplicationRunListeners、ApplicationA 阅读详情

SpringBoot-run启动原理

本文主要讲解SpringBoot启动类中的run( )方法。

启动类-----------run()方法

@SpringBootApplication
public class ApplicationTest {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationTest.class);
    }
}

1.如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的实例对象的实例方法。
在SpringApplication实例初始化的时候,它会提前做几件事情:

  1. 根据classpath里面是否存在某个特征类 (org.springframework.web.context.ConfigurableWebApplicationContext)来判断应用的类型(Web项目还是普通Java)。
  2. 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的 ApplicationContextInitializer初始化器。
  3. 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的 ApplicationListener监听器。
  4. 推断并设置main方法的定义类。

2.SpringApplication实例初始化并完成设置后,就开始执行run方法的逻辑了,首先遍历执行所有查找到的SpringApplicationRunListener监听器。调用它们的started()方法。

这个方法主要就是发布ApplicationStartedEvent应用程序开始事件

3.创建并配置当前Spring Boot应用将要使用的Environment环境(确定是否web环境)还有参数的装配

参数包括配置要使用的PropertySource配置属性源以及Profile配置文件

4.遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法

这个方法就是发布ApplicationEnvironmentPreparedEvent应用程序环境准备事件。

5.如果SpringApplication的showBanner属性被设置为true,则打印banner。

banner:英文广告横幅,在这里面指的是运行时输出的SpringBoot画面,还可以进行修改

6.创建ApplicationContext。然后根据条件决定是否添加ShutdownHook,判断是否使用自定义的ResourceLoader,以及完成Bean的定义信息,将之前准备好的Environment环境给创建好的ApplicationContext使用,其实就是根据是否为web环境,来决定创建什么类型的ApplicationContext。

ShutdownHook:在Java程序中可以通过添加关闭钩子,实现让程序退出时关闭资源、平滑退出的一个功能。

7.ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer初始化器,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)初始化方法来对已经创建好的ApplicationContext应用上下文进行进一步的处理。

8.遍历调用所有SpringApplicationRunListener的contextPrepared()方法。

这个方法就是发布ApplicationPreparedEvent应用程序准备事件

9.将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备好的ApplicationContext。

10.遍历调用所有SpringApplicationRunListener的contextLoaded()方法。

11.调用ApplicationContext的refresh()方法,装配context,beanfactory等重要的核心组件,完成IoC容器可用的最后一道工序,完成程序启动。

12.查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

CommandLineRunner 指的是平常开发中有可能需要实现在项目启动后自动执行的一个功能,比如:数据预加载

13.正常情况下,遍历执行SpringApplicationRunListener的finished()方法、就是发布ApplicationReadyEvent事件,启动完毕,表示服务已经可以开始正常提供服务了,该步骤在所有bean初始化完毕,所有回调处理完成,系统准备处理服务请求时触发。

如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理

以上就是run( )方法的讲解,没讲太深,步骤主要就是这些,如有错误或者讲解不到位的地方,请谅解并指出问题,发表自己的意见,一起共同讨论问题,谢谢。

springboot启动原理 springboot启动原理springboot 2.4.0 启动源码分析。 阅读详情

相关推荐

Java中启动线程start和run的两种方法

start()方法它的作用是启动一个新线程,run()就和普通的成员方法一样,可以被重复调用。接下来通过本文给大家分享Java中启动线程start和run的两种方法,需要的朋友参考下吧

SpringBoot启动过程中的run方法

springboot启动分为两部分, 1创建 SpringApplication对象,主要是加载Initializer和Listeners 2.执行run方法 关键方法解析 把启动参数 args 包装成了 ApplicationArguments 类型的对象。接下来把 运行时监听器、启动参数,送到了 prepareEnvironment 方法中创建环境对象。 prepareEnvironment 方法 创建环境对象 当前时SERVLET,所以会返回StandardServletEnvironment。 配

weixin_46666822的博客 1828

每天一个优秀提示词学习收藏 - 文本创作篇(二)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本创作 Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2403

SpringApplication.run 源码分析

SpringBoot 程序启动入口 @SpringBootApplication public class Springboot01DemoApplication { public static void main(String[] args) { SpringApplication.run(Springboot01DemoApplication.class, args); } } 点击SpringApplication.run查看源码 /** * 运行 Sp

rzpy_qifengxiaoyue的博客 668

Hypermesh联合ABAQUS—Sets的建立和编辑

打开part copy对话框在对话框的最上面位置可以输入copy后的名称,然后将最下面的Separate disconnected regions into parts(将不连续的区域分割成parts)选项的前面方框勾选上。打开abaqus软件界面,File→import→model,将file filter选为inp格式,找到要导入的有限元文件,单击OK导入文件。HyperWorks新建Set时,会在Model Browser显示,打开Create Set对话框显示详细信息。快捷键,高亮set的内容。

动力资料屋的博客 1293

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

mvn spring-boot:run 是怎样运行 Spring Boot 项目的?

Spring Boot 项目提供了多种运行应用的方式,今天我们要聊的是 mvn spring-boot:run 命令运行 Spring Boot 项目的原理,通过这篇文章你能学到的是 maven 插件基本内容以及 Spring Boot 对 maven 插件的应用。

大鹏的博客 1万+

动力学约束下的运动规划算法——状态栅格规划器(State Lattice Planner)

A*、RRT等算法建立的用于路径搜索的图模型是不考虑机器人的动力学约束的,其构建的图模型的两个相邻节点之间的路径可能是不可行的,或者很难被机器人跟踪的,现在我们想要使得图中相邻两个节点间的连接是一种满足动力学约束的可行的连接,那么如何构建一个这样的图呢? 构建这样的图通常有两种方法:第一种是基于控制空间的采样(正向方法)

慕羽★的博客 3108

idea tomcat war源码启动_从源码角度分析:SpringBoot内置tomcat启动原理

前言不得不说SpringBoot的开发者是在为大众程序员谋福利,把大家都惯成了懒汉,xml不配置了,连tomcat也懒的配置了,典型的一键启动系统,那么tomcat在springboot是怎么启动的呢?内置tomcat开发阶段对我们来说使用内置的tomcat是非常够用了,当然也可以使用jetty。 org.springframework.boot spring-boot-starter-w...

weixin_31281003的博客 176

华为OD机试真题 新系统 【社交网络相同爱好好友查询】

华为od机试真题 新系统【社交网络相同爱好好友查询】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试真题【社交网络相同爱好好友查询】多语言题解实现。

qq_45776114的博客 1338

YOLOv12中的A2C2f模块详解,涉及区域注意力模块(A2)和 R-ELAN 结构详解

区域注意力模块(Area Attention, A2)的设计出发点是为了解决传统注意力机制在计算复杂度和内存访问效率上的问题。传统的自注意力机制(Self-Attention)具有二次方的计算复杂度(O(n²)),尤其是在处理高分辨率图像时,计算成本非常高。此外,注意力机制的内存访问模式不如卷积神经网络高效,导致在实际应用中难以满足实时性要求。区域注意力模块通过将特征图划分为多个区域,并在每个区域内进行注意力计算,从而显著降低了计算复杂度。

Limiiiing的博客 5518

SpringBoot启动流程

Spring Boot 启动流程围绕“约定优于配置”和自动化装配机制展开,其核心目标是在最少配置的前提下完成 Spring 应用的初始化与运行。启动过程通常从 SpringApplication.run() 方法开始,首先进行应用环境与参数的准备,包括推断应用类型、加载 Environment 以及处理外部配置。随后创建并刷新 ApplicationContext,在该阶段完成 BeanDefinition 的加载、条件化自动配置的触发以及依赖注入。

404 Not Found 715

嵌入式系统开发笔记101:STM32CubeIDE安装过程中的2个错误及其解决方法

STM32CubeIDE在安装过程中,遇到了2个错误,本文阐述其解决方法。产生上述错误的原因,都在于中文。STM32CubeIDE不能很好的支持中文,所以在使用STM32CubeIDE进行项目设计的过程中,不要使用中文,包括项目所在的路径。

snmplink的博客 8562

SpringBoot学习之路---简单记录嵌入式Servlet容器的启动原理

在我的上一篇博客中简单记录了SpringBoot中嵌入式Servlet容器是如何实现自动配置的,并且如何读取我们自己编写的Customizer,这一篇博客来介绍一下这个嵌入式Servlet容器是如何启动的,并且联动之前的博客,来说明一下整个SpringBoot项目是如何跑起来的。 这一篇博客与上一篇嵌入式自动配置的博客关系比较大,合起来可以大致明白整个SpringBoot项目的嵌入式Servle...

LeslieLau的博客 220

信号处理算法:离散余弦变换(DCT)_(1).离散余弦变换(DCT)概述

离散余弦变换的数学定义如下:对于一个长度为NNN的离散信号xnx(n)xn,其DCT变换后的系数XkX(k)XkXk∑n0N−1xncos⁡πNn12kk012N−1Xkn0∑N−1​xncosNπ​n21​kk012N−1其中,kkk是频率指数,nnn是时间或空间索引。离散余弦变换(DCT)是一种强大的信号处理技术,广泛应用于图像压缩、音频处理、数据压缩等领域。

2401_87715305的博客 1556

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SpringBoot 学习(一)自动装配

springboot 启动时从 spring.factories 获取目标类(组件)的全限定名,将其添加到容器。查找并加载所有可用的初始化器,设置到 initializers 中。查找所有应用程序监听器,设置到 listeners 中。判断此应用是普通 Java 项目还是 Web 项目。推断并设置 main 方法的定义类,找到主类。springboot 的启动场景,功能场景。添加某功能对应的启动器依赖即可使用此功能。启动应用监听器、获取装配环境参数等。:SpringBoot 配置类。

歪比巴卜 432

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring boot启动原理及相关组件

ConfigurationClassPostProcessor的优先级为最高,它会对项目中的@Configuration注解修饰的类(@Component、@ComponentScan、@Import、@ImportResource修饰的类也会被处理)进行解析,解析完成之后把这些bean注册到BeanFactory中。在github里,我把Spring Boot应用启动的拓展组件(自定义的应用初始器、监听器、事件、ApplicationRunner)都写了例子,可参照阅读。

2601_94981449的博客 416

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

史上最烂 spring boot 原理分析

spring boot 启动过程、内嵌 tomcat 容器、条件装配、自动配置等。

后端为主,前端为辅。 538

SpringBoot源码深度解析(一):SpringBoot的自动配置原理

前言 SpringBoot流行之前,程序员大多是用SSM框架整合来进行WEB后端开发。这种方式非常麻烦,需要手动引入大量的包,还要配置很多XML文件,光是搭建环境就需要很久。 随着“约定大于配置”理念的流行,SpringBoot随之兴起,它大大简化了web开发的流程,可以让初学者快速上手。SpringBoot的核心理念大致有3点: 1、帮助开发者快速整合第3方框架,原理是maven依赖封装和自定义的Starter。 2、完全去除XML,采用纯注解的方式。原理是SpringBoot其实是根据Spring的体系

hjseo_seg的博客 202

SpringBoot源码解析(二):run()方法如何启动内嵌Tomcat容器

SpringBoot源码解析(二):run()方法如何启动内嵌Tomcat容器

我从不打没有准备的仗! 9626

深入剖析SpringBoot启动机制:run()方法详尽解读

本文深入解析SpringBoot的启动机制,以run()方法为核心,逐步追踪并详细解释其关键步骤。首先探讨run()方法的工作原理,然后深入代码层面分析各个关键环节。文章提供刷新后钩子和启动后任务的代码示例,帮助读者理解SpringBoot源码。通过学习这些内容,读者将掌握SpringBoot的启动流程,并学会将其应用于实际开发中。在深入探讨SpringBoot的启动机制之前,我们有必要先了解SpringBoot应用程序的基本结构和特性。

Xs_20240309的博客 1671

SpringBoot(2)—启动原理之run方法的运行

SpringBoot版本为:2.1.1.RELEASE 在上一篇文章中,我们讲到了SpringApplication对象的创建,接下来将会分析SpringApplication创建之后run()方法的执行。 通过debug的方式,我们可以进入run方法,源代码如下: ...

scj1014的博客 8767

SpringBoot启动原理之核心注解和run()方法-源码分析

微信公众号:测试加油站 关注可了解更多的测试开发技术。问题或建议,请公众号留言; 如果你觉得文章对你有帮助,欢迎转发[^1] 随着微服务的兴起,SpringBoot框架越来越火,相信大部分公司已经开始转向使用这个框架,我们开发测试平台的时候,也是会使用这个框架。但是这个框架的原理不知道大家是否了解,上一篇文章说了一下它的使用,所以本次说一下SpringBoot的启动原理,每次启动我们都会用到这...

NeilNiu 1179

SpringBoot —SpringApplication.run()方法剖析

springboot一键启动原理解析

m0_63330888的博客 3618

springboot项目启动的源码分析,springboot项目run方法底层原理(超详细,必会)

文章目录springboot项目启动的本质,springboot项目run方法底层原理初始化SpringApplicationRun方法深究 springboot项目启动的本质,springboot项目run方法底层原理 今天刚做完核酸闲的无聊还是拔一下源码解解乏 springboot启动首先执行的就是run方法,直接上源码: ——>run——>run 初始化SpringApplication 发现这里初始化了一个SpringApplication,点进去看一下嘛咱们: 重点看下下面两个方

世上哪有什么岁月静好,不过是有人替你负重前行 2638

SpringBoot 启动方法run()源码赏析

入口 通常一个简单的SpringBoot基础项目我们会有如下代码 @SpringBootApplication @RestController @RequestMapping("/") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 值得关注的有SpringApplication.run以及注解@Spri

码上代码的博客 2万+
上一篇: SpringBoot自动装配原理--------@SpringBootApplication注解
下一篇: 老生常谈系列一-----------HashMap底层原理(源码分析)
AY_G
博客等级 码龄7年 330粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值