84、原理解析-SpringApplication初始化流程

# SpringApplication创建初始化流程原理解析

`SpringApplication`的创建和初始化是Spring Boot应用启动的关键步骤,主要包括以下过程:

## 1. 创建SpringApplication实例

### 1.1 调用构造函数

- 当调用`SpringApplication.run()`方法时,会先创建`SpringApplication`实例。

- 构造函数接受主配置类(通常标有`@SpringBootApplication`注解的类)作为参数。

### 1.2 设置基本属性

- **ResourceLoader**:设置资源加载器,默认为`null`,后续会根据需要自动设置。

- **PrimarySources**:将传入的主配置类保存到`primarySources`集合中。

- **MainApplicationClass**:推断并保存启动应用的主类,用于后续反射调用。

## 2. 推断Web应用类型

### 2.1 类路径检测

- 通过`WebApplicationType.deduceFromClasspath()`方法,根据类路径中是否存在特定类来判断应用类型:

    - **REACTIVE**:存在`org.springframework.web.reactive.DispatcherHandler`且不存在`org.springframework.web.servlet.DispatcherServlet`。

    - **SERVLET**:存在`javax.servlet.Servlet`和`org.springframework.web.servlet.DispatcherServlet`。

    - **NONE**:不满足以上条件,为非Web应用。

## 3. 加载初始化器和监听器

### 3.1 加载`ApplicationContextInitializer`

- 从`META-INF/spring.factories`文件中获取并实例化所有`ApplicationContextInitializer`的实现类。

- 这些初始化器在上下文刷新前执行,可用于对应用上下文进行自定义配置。

### 3.2 加载`ApplicationListener`

- 从`META-INF/spring.factories`文件中获取并实例化所有`ApplicationListener`的实现类。

- 这些监听器用于监听Spring应用生命周期中的事件,如应用启动、上下文刷新等。

## 4. 设置引导上下文(Bootstrap Context)

- 创建`BootstrapContext`,用于在应用上下文初始化之前执行一些引导操作。

- 加载`BootstrapRegistryInitializer`,用于初始化引导注册表,提供早期访问配置和环境信息的能力。

## 5. 环境准备

### 5.1 配置环境

- 创建并配置应用环境(`ConfigurableEnvironment`),包括系统属性、环境变量、命令行参数等。

- 根据应用类型和环境信息,创建相应的环境对象,如`StandardServletEnvironment`或`StandardReactiveWebEnvironment`。

### 5.2 配置属性源

- 将命令行参数、配置文件等属性源添加到环境中,确保应用可以访问这些配置信息。

## 6. 创建应用上下文

### 6.1 创建上下文实例

- 根据推断的应用类型,创建相应的应用上下文:

    - **SERVLET**:创建`AnnotationConfigServletWebServerApplicationContext`。

    - **REACTIVE**:创建`AnnotationConfigReactiveWebServerApplicationContext`。

    - **NONE**:创建`AnnotationConfigApplicationContext`。

### 6.2 准备上下文

- 将初始化器、监听器、环境等配置应用到上下文。

- 调用`prepareContext()`方法,执行上下文初始化前的准备工作。

## 7. 刷新应用上下文

### 7.1 加载Bean定义

- 扫描并加载所有配置类中的Bean定义,包括组件扫描、导入的配置文件等。

### 7.2 实例化Bean

- 根据Bean定义,实例化并初始化所有单例Bean。

### 7.3 触发事件

- 发布上下文刷新事件(`ContextRefreshedEvent`),通知所有监听器上下文已刷新。

## 8. 启动嵌入式Web服务器(可选)

- 如果是Web应用,启动嵌入式的Tomcat、Jetty或Undertow服务器。

- 将应用部署到服务器上,开始监听请求。

## 9. 完成启动

- 打印启动日志,显示应用启动成功的信息。

- 应用进入运行状态,开始处理请求或执行业务逻辑。

---

通过上述流程,`SpringApplication`完成了应用的创建、初始化和启动,使Spring Boot应用能够快速、便捷地运行起来。

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

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

相关文章

【数理逻辑】 选择公理与集值映射

目录 选择公理1. 有限指标集 I I I2. 可数无限指标集 I I I (简称为 ACC 或 ACω)3. 不可数无限指标集 I I I4. 选择公理的层级与数学应用5. 选择公理的深层意义 集值映射的选择函数1. 选择公理的核心作用2. 不同情况下的依赖性分析3. AC 的必要性证明…

微信小程序使用wx.chooseImage上传图片时进行压缩,并添加时间水印

在微信小程序的开发过程,经常会使用自带的api(wx.chooseImage)进行图片拍照或选择图片进行上传,有时图片太大,造成上传和下载时过慢,现对图片进行压缩后上传,以下是流程和代码 一、小程序的版本选择了3.2.5&#xff0…

RAII简介

📦 一、技术原理简介:RAII是个“托管狂魔” 想象你有个健忘的朋友,每次借东西都会忘记归还。RAII(Resource Acquisition Is Initialization,资源获取即初始化)就是C派来的“超级管家”: “你负…

微信小程序入门实例_____打造你的专属单词速记小程序

上次通过天气查询小程序,我们初探了微信小程序开发的世界。这次,咱们再挑战一个有趣又实用的项目 ——“单词速记小程序”。无论是学生党备考,还是上班族提升英语,都能用得上!接下来就跟着我,一步一步把它做…

gateway白名单存储nacos,改成存储数据库

前言 很久没写博客了,csdn都开始ai润色了,之前都是看相应框架的源码看了个遍,感觉底层原理都差不多,这阵子着手改造了下gateway中的白名单,之前白名单存储到nacos,要改成存到数据库。里面涉及到浅浅的源码…

ubentu服务器版本安装Dify

Docker 中安装Dify 首先安装Docker 1. 克隆Dify代码仓库 从github克隆 Dify 源代码至要本地环境。 我的ubentu服务器版本,我把源代码下载到 /var/下 在var文件夹下执行 git clone https://github.com/langgenius/dify.git执行成功后,进入Dify源代码的…

Redis分布式锁实战:从入门到生产级方案

目录 一、为什么需要分布式锁? 二、Redis分布式锁核心特性 三、实现方案与代码详解 方案1:基础版 SETNX EXPIRE 原理 代码示例 问题 方案2:Redisson框架(生产推荐) 核心特性 代码示例 优势 方案3&#xff…

【Redis】StringRedisTemplate 和 RedisTemplate 的区别

StringRedisTemplate 和 RedisTemplate 是 Spring Data Redis 提供的两种用于操作 Redis 的模板类,它们的核心区别在于 序列化方式 和 操作的数据类型。以下是两者的主要区别和使用建议: ✅ 1. 数据类型支持 类名支持的数据类型说明RedisTemplate支持所…

docker-compose快速搭建redis集群

目录结构 redis-cluster/ ├── config/ │ ├── master.conf │ ├── slave1.conf │ └── slave2.conf └── docker-compose.yml配置文件内容 1. config/master.conf # Redis主节点配置 port 6379 bind 0.0.0.0 protected-mode no logfile "redis-mas…

SpringCloud系列(39)--SpringCloud Gateway常用的Route Predicate

前言:在上一节中我们实现了SpringCloud Gateway的动态路由 ,而在本节中我们将着重介绍各种Route Predicate的作用。 1、可以到官方文档里查看常用的Route Predicate的种类 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.REL…

渐变色的进度条控件

近日,用VB.net2003重写了一个渐变色的进度条控件。主要有以下功能: 支持自定义进度条分段数量,可拆分为多个步骤;每个步骤可独立显示完成百分比及渐变色效果。 每个步骤均可配置任务名称和描述;运行时能实时显示当前执…

【DICOM后处理】qt+vs 实现DICOM数据四视图显示

目录 1、DICOM四视图2、vtkImageViewer2 实现二维平面图显示3、vtkVolume实现三维体数据显示4、实现界面图 1、DICOM四视图 DICOM四视图通常指同时显示医学影像的四个不同平面或视角,用于全面分析三维数据(如CT、MRI等)。 标准四视图布局&a…

Google Maps 安装使用教程

一、Google Maps 简介 Google Maps 是谷歌提供的地图服务,通过其 JavaScript API,开发者可以在网页中嵌入地图,添加标记、路径、地理编码、路线导航等功能,适用于位置展示、物流追踪、LBS 应用等场景。 二、获取 Google Maps API…

Nginx+Keepalived实现前台服务高可用

现阶段项目开发往往采用前后台分离,前台常用的技术有vue、react等,前台代码部署在nginx中,代码中配置了后台服务的网关地址,由网关向后台分发服务请求,架构示意图如下: 在上述架构图中,如果Ngin…

Gradio全解13——MCP协议详解(5)——Python包命令:uv与uvx实战

Gradio全解13——MCP协议详解(5)——Python包命令:uv与uvx实战 第13章 MCP协议详解13.5 Python包命令:uv与uvx实战13.5.1 uv核心亮点与常用命令1. uv介绍2. 安装与项目管理3. 脚本与工具4. Python版本与pip接口 13.5.2 uv核心指令…

OD 算法题 B卷【求最小步数】

文章目录 求最小步数 求最小步数 求从坐标零点到坐标点n的最小步数,一次只能沿着横坐标轴向左或向右移动2或3;途经的坐标点可以为负数; 输入描述: 坐标点n 输出描述: 从坐标零点移动到坐标点n的最小步数 n在【1,10^9】 示例1 输入&#xf…

Elasticsearch 集群升级实战指引—7.x 升级到 8.x

升级Elasticsearch集群从7.x到8.x是一项复杂且关键的任务,涉及重大版本变更(如API调整、配置变更、安全功能强制启用等),可能影响集群的性能和稳定性。结合您提到的业务量增长导致索引写入变慢的问题,本指引不仅提供详…

JWT学习总结

文章目录 前置知识Authorization头部和 CookieCRSF攻击 JWT概念JWT认证流程使用Springboot整合JWTJwtUtil JWT案例控制器JWT拦截器注册拦截器结果 session VS Jwt 前置知识 Authorization头部和 Cookie Authorization 头部和 Cookie 是 HTTP 协议中两种不同的身份认证 / 信息…

阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025

近日,由阿里云消息团队发表的 Apache RocketMQ 创新论文被 CCF-A 类软件工程顶级会议 FSE 2025 Industry Track 录用。 ACM FSE(The ACM International Conference on the Foundations of Software Engineering)是享有盛誉的国际学术会议&…

定制WordPress管理后台

WordPress作为全球最流行的建站工具,因其灵活性和易用性受到广泛欢迎。许多服务器提供商都支持一键安装WordPress,例如Hostease,使新手用户也能轻松搭建属于自己的网站。然而,后台的默认设置可能无法完全满足不同用户的需求。定制…