Spring Boot 自動加載流程詳解

前言

Spring Boot 是一個基于約定優于配置理念的框架,它通過自動加載機制大大簡化了開發者的配置工作。本文將深入探討 Spring Boot 的自動加載流程,并結合源碼和 Mermaid 圖表進行詳細解析。


一、Spring Boot 自動加載的核心機制

Spring Boot 的自動加載主要依賴以下幾個核心注解和機制:

  1. @SpringBootApplication

    • 這是 Spring Boot 應用程序的入口點注解。
    • 它是一個組合注解,包含以下三個核心注解:
      • @Configuration:聲明該類是一個配置類,可以定義 Bean。
      • @EnableAutoConfiguration:啟用自動配置功能。
      • @ComponentScan:掃描指定包及其子包下的組件(如 @Controller@Service 等)。
  2. @EnableAutoConfiguration

    • 通過讀取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中的類列表,加載符合條件的自動配置類。
  3. 條件注解

    • Spring Boot 使用條件注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等)來判斷是否加載某個自動配置類。
  4. spring.factories 文件(舊版機制)

    • 在 Spring Boot 3.x 及之前版本中,spring.factories 文件用于注冊自動配置類。
  5. AutoConfiguration.imports 文件(新版機制)

    • 從 Spring Boot 3.x 開始,推薦使用 AutoConfiguration.imports 文件替代 spring.factories

二、Spring Boot 自動加載流程

以下是 Spring Boot 自動加載的主要流程,分為以下幾個步驟:

1. 啟動類加載

當應用程序啟動時,Spring Boot 會從主類(帶有 @SpringBootApplication 注解的類)開始加載。

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
  • SpringApplication.run() 方法會初始化 Spring 容器并啟動應用。

2. 加載自動配置類

Spring Boot 會根據以下步驟加載自動配置類:

(1) 掃描 AutoConfiguration.imports 文件

Spring Boot 會讀取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,加載其中定義的自動配置類。

示例文件內容:

org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
(2) 條件判斷

每個自動配置類都會通過條件注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等)進行判斷,只有滿足條件的配置類才會被加載。

示例代碼:

@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {@Beanpublic DataSource dataSource() {return new EmbeddedDatabaseBuilder().build();}
}

3. 注冊 Bean 到容器

滿足條件的自動配置類會被實例化,并將其定義的 Bean 注冊到 Spring 容器中。


三、源碼解析

以下是 Spring Boot 自動加載流程的關鍵源碼分析:

1. SpringApplication.run() 方法

這是 Spring Boot 應用程序啟動的入口方法。

public ConfigurableApplicationContext run(String... args) {// 初始化應用上下文ConfigurableApplicationContext context = createApplicationContext();// 準備環境、加載配置、刷新上下文refreshContext(context);return context;
}

2. AutoConfigurationImportSelector

該類負責加載 AutoConfiguration.imports 文件中的自動配置類。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());return configurations;
}

3. 條件注解的實現

@ConditionalOnClass 為例,其核心邏輯在 OnClassCondition 類中實現。

public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {String className = (String) metadata.getAnnotationAttributes(ConditionalOnClass.class.getName()).get("value");try {Class.forName(className);return ConditionOutcome.match("Class " + className + " is present");} catch (ClassNotFoundException e) {return ConditionOutcome.noMatch("Class " + className + " is not present");}
}

四、流程圖

以下是 Spring Boot 自動加載流程的流程圖:

啟動主類
加載 @SpringBootApplication
解析 @EnableAutoConfiguration
讀取 AutoConfiguration.imports 文件
加載自動配置類
條件注解判斷
注冊 Bean 到容器
啟動完成

五、總結

Spring Boot 的自動加載流程通過 @SpringBootApplication 注解觸發,結合 AutoConfiguration.imports 文件和條件注解實現了自動化配置。開發者可以通過自定義自動配置類或覆蓋默認配置來滿足特定需求。

希望本文能幫助你更好地理解 Spring Boot 的自動加載機制!如果你有任何疑問,歡迎在評論區留言討論。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76365.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年危化品安全管理人員備考指南|智能題庫+核心考點解析

作為危化品生產單位安全管理人員&#xff08;主要負責人&#xff09;&#xff0c;考試內容主要涵蓋三大模塊&#xff1a; 法律法規體系 《安全生產法》修訂要點&#xff08;2023版&#xff09; 危險化學品重大危險源辨識標準&#xff08;GB 18218&#xff09; 最新《化工過…

如何優雅使用 ReentrantLock 進行加解鎖:避免常見坑點,提高代碼可維護性

引言&#xff1a;鎖的基本概念和問題 在多線程編程中&#xff0c;為了確保多個線程在訪問共享資源時不會發生沖突&#xff0c;我們通常需要使用 鎖 來同步對資源的訪問。Java 提供了不同的鎖機制&#xff0c;其中 ReentrantLock 是一種最常用且功能強大的鎖&#xff0c;它屬于…

Redhat紅帽 RHCE8.0認證體系課程

課程大小&#xff1a;7.7G 課程下載&#xff1a;https://download.csdn.net/download/m0_66047725/90546064 更多資源下載&#xff1a;關注我 紅帽企業 Linux 系統的管理技能已經成為現代數據中心的核心競爭力。 Linux 在支持混合云、跨物理服務器、虛機、私有云和公共云計…

Shell腳本編程

目錄 1. Shell腳本概述 什么是Shell&#xff1f; Shell的作用 常見的Shell類型 2. 環境搭建與安裝 Linux系統 macOS系統 Windows系統 3.安裝并配置Zsh&#xff08;macOS/Linux&#xff09; 4. Shell基礎語法 變量與數據類型 輸入交互 5. Shell腳本進階 進程管理 …

學生管理系統(Python)

運行結果&#xff1a; 源代碼&#xff1a; """ 項目&#xff1a;類似于學生管理系統---增刪改查 """ #封裝一個學生類 import random class Student: def __init__(self,stuid,name,score): self.stuid stuid self.name name self.score …

電商素材革命:影刀RPA魔法指令3.0驅動批量去水印,實現秒級素材凈化

本文 去除水印實操視頻展示電商圖片水印處理的困境?影刀 RPA 魔法指令 3.0 強勢登場?利用魔法指令3.0兩步實現去除水印操作關于影刀RPA 去除水印實操視頻展示 我們這里選擇了4張小紅書里面比較帥氣的圖片&#xff0c;但凡用過小紅書的都知道&#xff0c;小紅書右下角是會有小…

Seq2Seq - GRU補充講解

nn.GRU 是 PyTorch 中實現門控循環單元&#xff08;Gated Recurrent Unit, GRU&#xff09;的模塊。GRU 是一種循環神經網絡&#xff08;RNN&#xff09;的變體&#xff0c;用于處理序列數據&#xff0c;能夠更好地捕捉長距離依賴關系。 ?重點掌握輸入輸出部分輸入張量&#…

設計模式-觀察者模式和發布訂閱模式區別

文章目錄 其他不錯的文章 二者有類似的地方&#xff0c;也有區別。 引用的文章說的已經比較清楚了&#xff0c;這里只列出對比圖。 對比點觀察者模式發布訂閱模式中間人角色無事件中心&#xff0c;觀察者直接訂閱目標有事件中心&#xff0c;發布者與訂閱者通過事件中心通信關系…

【SQL】基于多源SQL 去重方法對比 -- 精華版

【SQL】基于SQL 去重方法對比 -- 精華版 一、引言二、基于SQL去重方法完整對比1. MySQL去重方法及優劣勢1.1 ?DISTINCT關鍵字1.2 GROUP BY子句1.3 UNION系列操作1.4 子查詢 自關聯 2. Hive去重方法及優劣勢2.1 DISTINCT關鍵字2.2 ?GROUP BY子句2.3 ?ROW_NUMBER窗口函數2.4 …

電腦命名配置很高,為什么運行軟件特別卡

估計很多同學都碰見過這種情況&#xff0c;以我的Redmi G為例&#xff0c;I9-14待CPU&#xff0c;又換了一條內存條&#xff0c;現有配置I9-14900&#xff0c;40G內存5200MT/s&#xff0c;4060顯卡&#xff0c;為啥運行兩個辦公軟件就卡的不行&#xff0c;風扇狂轉&#xff0c;…

Spring Boot默認注冊的轉換器列表及其功能說明。這些轉換器使得控制器方法可以直接接收Integer、Long、Date等類型參數,無需手動實現轉換

以下是Spring Boot默認注冊的轉換器列表及其功能說明。這些轉換器使得控制器方法可以直接接收Integer、Long、Date等類型參數&#xff0c;無需手動實現轉換&#xff1a; 默認轉換器列表及功能 1. 基礎類型轉換器 轉換器名稱功能示例場景StringToIntegerConverter將字符串轉換…

chrome提示https不安全, 不能記住賬號密碼怎么辦? 可以利用js輸入賬號

背景: 在內網搭建的服務, 由于https證書問題, 可能會被chrome瀏覽器提示不安全 此時, 默認的記住賬號密碼功能就無法使用, 那么此時只能手動輸入了嗎? 想到了幾種方案 1.利用外置軟件, 模擬按鍵輸入(比如按鍵精靈, 缺點是依賴外部軟件, 運行速度也慢, 且執行時占用了輸入焦…

探秘Transformer系列之(25)--- KV Cache優化之處理長文本序列

探秘Transformer系列之&#xff08;25&#xff09;— KV Cache優化之處理長文本序列 文章目錄 探秘Transformer系列之&#xff08;25&#xff09;--- KV Cache優化之處理長文本序列0x00 概述0x01 優化依據1.1 稀疏性1.2 重要性1.3 小結 0x02 稀疏化1.1 分類1.2 靜態稀疏化1.2.1…

【開發經驗】結合實際問題解決詳述HTTPS通信過程

最近的開發調試過程中涉及到了HTTPS發送與接收&#xff0c;遇到實際問題才發現對這部分尚屬于一知半解。結合實際問題的解決過程來詳細整理以下HTTPS通信過程。 需要調試的功能為BMC作為客戶端向搭建好的Web服務器發送HTTPS請求&#xff0c;Web服務器負責接收處理發送過來的HT…

【Android】Android Activity 橫屏設置詳解及常見異常問題解決方法匯總

在 Android 開發中&#xff0c;我們經常需要控制 Activity 的屏幕方向&#xff0c;例如視頻播放、游戲、VR/AR 應用等場景通常希望默認橫屏顯示。本文將講解如何通過 Manifest 配置 和 Java/Kotlin 代碼 設置橫屏顯示&#xff0c;并分析常見設置無效的原因與解決方法。 一、通過…

文件相關:echo重定向管道命令擴展詳解

一、echo 文字內容 echo 會在終端中顯示參數指定的文字&#xff0c;通常會和 重定向 聯合使用 二、重定向 > 和 >> Linux 允許將命令執行結果 重定向到一個 文件將本應顯示在終端上的內容 輸出 / 追加 到指定文件中 其中&#xff1a; >表示輸出&#xff0c;會覆…

Python 中使用單例模式

有這么一種場景&#xff0c;Web服務中有一個全局資源池&#xff0c;在需要使用的地方就自然而言引用該全局資源池即可&#xff0c;此時可以將該資源池以單例模式實現。隨后&#xff0c;需要為某一特殊業務場景專門準備一個全局資源池&#xff0c;于是額外復制一份代碼新建了一個…

websocket深入-webflux+websocket

文章目錄 背景版本約定配置文件代碼使用webflux使用websocket配置文件handler基類實現類注冊路由 背景 基于更復雜的情況和更高的開發要求&#xff0c;我們可能會遇到必須同時要使用webflux和websocket的情況。 版本約定 JDK21Springboot 3.2.0Fastjson2lombok 配置文件 &…

致遠OA —— 表單數據獲取(前端)

文章目錄 :apple: 業務需求描述 &#x1f34e; 業務需求描述 測試案例&#xff1a; https://pan.quark.cn/s/3f58972f0a27 官網地址&#xff1a; 需求描述&#xff1a; 點擊獲取數據接口&#xff0c;調用后臺&#xff0c;將從后臺查詢到的數據回寫到表單的內容中。 如下…

51c嵌入式~繼電器~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/13775821 一、繼電器應用細節 繼電器的應用&#xff0c;相信大家都知道&#xff0c;在電路中只要給它供電、斷電也就可以工作了。本文討論它的應用細節。 現在流行的接法 圖中&#xff0c;繼電器的線圈經過Q1作為開關&am…