Spring Boot源码分析一:启动流程

1. 引言

SpringBoot是一个广泛使用的Java框架,旨在简化基于Spring框架的应用程序的开发过程。在这篇文章中,我们将深入探讨SpringBoot应用程序的启动流程,了解其背后的机制。

2. Spring Boot 启动概览

SpringBoot应用程序的启动通常从一个包含 main 方法的类开始,例如:

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

这里的SpringApplication.run是启动SpringBoot应用程序的入口。接下来,我们将深入分析这个方法及其调用的各个阶段。

3. SpringApplication 类详解

SpringApplication类是SpringBoot应用程序启动过程的核心类。它负责初始化应用程序的上下文,加载配置,启动嵌入式服务器等。

3.1 SpringApplication构造函数

SpringApplication类有多个构造函数,常用的是接收一个或多个Class<?> 参数的构造函数:

public SpringApplication(Class<?>... primarySources) {this.setInitializers((Collection) this.getSpringFactoriesInstances(ApplicationContextInitializer.class));this.setListeners((Collection) this.getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = this.deduceMainApplicationClass();
}

这里设置了初始化器和监听器,并推断出主应用程序类。

3.2 run 方法

SpringApplication.run方法是启动SpringBoot应用程序的入口:

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return (new SpringApplication(primarySources)).run(args);
}

这个方法内部调用了SpringApplication实例的run方法:

public ConfigurableApplicationContext run(String... args) {// 初始化阶段this.configureHeadlessProperty();SpringApplicationRunListeners listeners = this.getRunListeners(args);listeners.starting();// 环境准备阶段ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);this.configureIgnoreBeanInfo(environment);// 上下文创建阶段Banner printedBanner = this.printBanner(environment);ConfigurableApplicationContext context = this.createApplicationContext();this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 上下文刷新阶段this.refreshContext(context);this.afterRefresh(context, applicationArguments);listeners.finished(context, null);// 应用程序运行阶段this.callRunners(context, applicationArguments);return context;
}

接下来,我们逐步解析这些方法的具体实现。

4. 启动流程详解

4.1 初始化阶段

在这个阶段,主要是一些基本属性的设置和启动监听器的初始化:

this.configureHeadlessProperty();
SpringApplicationRunListeners listeners = this.getRunListeners(args);
listeners.starting();

configureHeadlessProperty:设置系统属性java.awt.headless,用于处理缺少显示屏、键盘或鼠标的环境。
getRunListeners:获取并初始化SpringApplicationRunListeners,这些监听器在整个启动过程中会监听并响应不同的事件。

4.2 环境准备阶段

准备应用运行的环境,包括配置属性和配置文件等:

ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
this.configureIgnoreBeanInfo(environment);

prepareEnvironment:配置并准备环境,调用监听器的environmentPrepared方法。
configureIgnoreBeanInfo:配置是否忽略BeanInfo信息。

4.3 上下文创建阶段

创建并准备 Spring 应用上下文:

ConfigurableApplicationContext context = this.createApplicationContext();
this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

createApplicationContext:根据配置创建具体的应用上下文,例如 AnnotationConfigApplicationContext。
prepareContext:准备上下文,加载配置,注册Bean,调用监听器的 contextPrepared 方法。

4.4 上下文刷新阶段

刷新应用上下文,完成 Bean 的初始化和依赖注入:

this.refreshContext(context);
this.afterRefresh(context, applicationArguments);

refreshContext:刷新应用上下文,触发 Spring 的生命周期事件。
afterRefresh:刷新后的操作,通常用于自定义逻辑。

4.5 应用程序运行阶段

调用所有实现了CommandLineRunner和ApplicationRunner接口的 Bean:

this.callRunners(context, applicationArguments);

callRunners:遍历并调用所有CommandLineRunner和 ApplicationRunner。

5. 结论

通过深入分析SpringBoot应用程序的启动流程,我们可以更好地理解其内部机制,进而在开发中更好地利用这些机制,提高开发效率和代码质量。在后续的文章中,我们将继续探讨SpringBoot的其他关键特性和实现原理。

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

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

相关文章

健康与生活助手:Kompas AI的高效应用

一、引言 在现代社会&#xff0c;随着生活节奏的加快和工作压力的增加&#xff0c;人们的健康问题日益凸显。健康管理已经成为每个人关注的重点。Kompas AI作为一款智能助手&#xff0c;通过其先进的人工智能技术&#xff0c;为用户提供全面的健康管理服务&#xff0c;帮助用户…

JavaSE 利用正则表达式进行本地和网络爬取数据(爬虫)

爬虫 正则表达式的作用 作用1&#xff1a;校验字符串是满足规则 作用2&#xff1a;在一段文本中查找满足需要的内容 本地爬虫和网络爬虫 Pattern类 表示正则表达式 Matter类 文本编译器&#xff0c;作用按照正则表达式的规则去读取字符串&#xff0c;从头开始读取&#xf…

爬虫day2

bs4解析-HTML语法 bs4解析比较简单,但是呢,首先你需要了解一丢丢的html知识,然后再去使用bs4去提取,逻辑和编写难度就会非常简单和清晰. HTML(Hyper Text Markup Language)超文本标记语言,是我们编写网页的最基本也是最核心的一种语言.其语法规则就是用不同的标签对网页上的内…

中间件(express)

中间件&#xff08;express&#xff09; 在Express.js中&#xff0c;中间件&#xff08;Middleware&#xff09;是一个重要的组成部分&#xff0c;用于处理HTTP请求和响应。中间件函数具有特定的签名&#xff0c;并可以接受请求对象&#xff08;req&#xff09;、响应对象&…

[python学习]--使用相对路径导入包

在Python中&#xff0c;使用相对路径导入包或模块通常是在包内部进行的&#xff0c;以便在不指定完整包路径的情况下引用同一包内的其他模块。相对导入使用点&#xff08;.&#xff09;来表示当前包或父包。但是&#xff0c;需要注意的是&#xff0c;相对导入在包的外部&#x…

【idea】gradle多模块构建项目内存溢出终止问题解决

背景 idea构建多模块项目&#xff0c;构建报错 Daemon is stopping immediately JVM garbage collector thrashing and after running out of JVM memory 解决 进到下图目录下 在文件管理中进入上面目录添加gradle.properties文件&#xff0c;内容如下 org.gradle.jvmargs-…

【TensorFlow深度学习】在深度学习项目中实施迁移学习策略

在深度学习项目中实施迁移学习策略 在深度学习项目中实施迁移学习策略:加速模型训练与提升性能的艺术1. 迁移学习简介与优势2. 迁移学习的类型3. 代码示例:使用Keras实施特征提取4. 微调模型以进一步提升性能5. 结果评估与模型保存结语在深度学习项目中实施迁移学习策略:加速…

hive on spark 的架构和常见问题 - hive on spark 使用的是 yarn client 模式还是 yarn cluster 模式?

hive on spark 的架构和常见问题 - hive on spark 使用的是 yarn client 模式还是 yarn cluster 模式&#xff1f; 1. 回顾下 spark 的架构图和部署模式 来自官方的经典的 spark 架构图如下&#xff1a; 上述架构图&#xff0c;从进程的角度来讲&#xff0c;有四个角色/组件&…

【面试干货】抽象类与接口的区别

【面试干货】抽象类与接口的区别 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程中&#xff0c;抽象类和接口是两个非常重要的概念&#xff0c;它们都为代码的可扩展性和复用性提供了基础。但是&#xff0c;它们之间也有一些明显…

架构师之 Kafka 核心概念入门

Kafka 核心概念 作为架构师,理解 Kafka 的核心概念至关重要。这些概念是构建高效、可靠的 Kafka 系统的基础。 以下是需要掌握的 Kafka 核心概念及其详细说明: 1. Topic 定义:Topic 是 Kafka 中用于存储和分类消息的逻辑命名空间。每个 Topic 代表一类数据流, 例如日志、…

maxwell源码编译安装部署

目录 1、组件环境 2、maxwell安装前提 3、maxwell安装 3.1、maxwell下载 3.1.1、最新版本下载 ​编辑 3.1.2、历史版本下载 3.2、maxwell安装 3.3、maxwell配置 3.2.1、mysql开启binlog 3.3.2、maxwell元数据配置 3.3.3、maxwell配置任务 4、maxwell部署问题 4.1、utf…

django学习入门系列之第三点《CSS基础样式介绍1》

文章目录 高度和宽度块级标签|行内标签的转换字体和颜色往期回顾 高度和宽度 如果在块级标签内&#xff0c;单独定义高度的话&#xff0c;宽度会默认拉满 使用百分比的时候 如果是块级标签&#xff0c;宽度可以用百分比&#xff0c;高度用不了&#xff08;使用起来没效果&…

Mac OS 安装frida

安装frida和frida-tools Python是基础&#xff0c;提前装好Python 终端执行 python3 -m pip install frida 如果出现error 按照提示处理 信息提示&#xff1a;brew install pipx 于是终端执行&#xff1a; brew install pipx 安装frida&#xff1a; pipx install frida…

jetson设置

首先准备一张16g以上的sd卡 点此下载sd套件 https://www.sdcard.org/downloads/formatter/eula_windows/SDCardFormatterv5_WinEN.zip 这里下载sd卡格式化 然后https://etcher.download/download-etcher/ 下载etcher 看这篇https://blog.csdn.net/automoblie0/article/deta…

Apache Flink在IoT指标开发流处理全过程案例

目录 1. 环境搭建与基本概念 2. 数据摄入 3. 数据解析与转换 4. 定义时间窗口与计算 5. 复杂事件处理 6. 数据输出与存储 7. 整合流程与执行 8. 性能调优与监控 在物联网(IoT)领域,Apache Flink作为强大的流处理框架,能够高效地处理从传感器、设备等来源产生的海量实…

uniapp实现tabBar功能常见的方法

在 UniApp 中实现 Tab 功能通常涉及到使用 <navigator> 组件结合 tabBar 配置&#xff0c;或者通过自定义的视图切换逻辑来实现。以下是两种常见的实现方式&#xff1a; 1. 使用 tabBar 配置 UniApp 支持在 pages.json 文件中配置 tabBar&#xff0c;以在应用的底部或顶…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS Huawei (华为) FusionServer 定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS Huawei (华为) FusionServer 定制版 ESXi 8.0U2 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、NEC (日电)、Huawei (华为)、xFusion (超聚…

前端vue实战项目结构、常用编辑器vs code 配置

5.Complete JSDoc Tags 6.Custom CSS and JS Loader 7.Debugger for Chrome 8.EditorConfig for VS Code 9.ESLint ☆☆☆ 10.gitignore 11.GitLens — Git supercharged 12.npm 13.PostCSS syntax !important 14.Vetur ☆ 15.vscode-icons 16.vue-i18n 17.Markdow…

2024年最值得推荐的10款免费数据可视化工具!

数据可视化之所以受欢迎&#xff0c;不仅因为它简化了我们查看繁杂数据的方式&#xff0c;还在于数据可视化可以加快我们获取数据信息的速度。但是对于初学者来说&#xff0c;使用数据可视化工具并不能够快速上手。因此本篇文章特意为大家列出了10款免费的数据可视化工具&#…

html做一个画柱形图的软件

你可以使用 HTML、CSS 和 JavaScript 创建一个简单的柱形图绘制软件。为了方便起见&#xff0c;我们可以使用一个流行的 JavaScript 图表库&#xff0c;比如 Chart.js&#xff0c;它能够简化创建和操作图表的过程。 以下是一个完整的示例&#xff0c;展示如何使用 HTML 和 Cha…