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

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,使新手用戶也能輕松搭建屬于自己的網站。然而,后臺的默認設置可能無法完全滿足不同用戶的需求。定制…