springboot自動配置原理例子講解

Spring Boot 的自動配置是其核心特性之一,它幫助開發者**"開箱即用"**地使用各種第三方庫或 Spring 組件,而無需手動配置 Bean。這一切的背后,都依賴于 Spring Boot 的自動配置機制。


我們分兩部分來說:

  1. Spring Boot 自動配置的整體流程

  2. 我們依賴的第三方包是如何一步步被自動配置并導入使用的


一、Spring Boot 自動配置的整體流程

1. @SpringBootApplication 注解啟動入口
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
  • @SpringBootApplication 是一個組合注解,包含:

    • @SpringBootConfiguration(實際上就是 @Configuration

    • @EnableAutoConfiguration

    • @ComponentScan

2. 關鍵點:@EnableAutoConfiguration

這個注解的作用就是啟用自動配置,底層依賴的是:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)

這里的核心邏輯是:導入一批配置類,這些類就定義了我們依賴的組件如何被自動裝配。

3. AutoConfigurationImportSelector 工作機制
  • 它會去加載 META-INF/spring.factories(Spring Boot 2.x) 或 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.x)中的配置類列表。

  • 這些類就是一堆以 xxxAutoConfiguration 結尾的類,比如:

# META-INF/spring.factories(Spring Boot 2.x)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...

Spring Boot 會按需加載這些自動配置類,也就是判斷你是否引入了相關依賴、是否配置了對應屬性等,來決定要不要配置這個組件。


二、依賴的包是如何一步步自動配置導入的?

舉個例子:我們引入了 spring-boot-starter-data-redis,程序中就能直接用 RedisTemplate

來看這條鏈路是怎么走通的:

步驟 1:你引入了 Redis 的 starter
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

它的依賴會自動包含:

  • spring-data-redis

  • lettuce-core(默認客戶端)

  • spring-boot-autoconfigure

步驟 2:自動配置類生效

spring-boot-autoconfigure 包的 spring.factories 文件中,你會看到:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

這個配置類就被加載了。

步驟 3:RedisAutoConfiguration 中的 Bean 被自動注冊

打開源碼可以看到:

@Configuration
@ConditionalOnClass(RedisOperations.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {...}
}

這表示:

  • 如果項目中有 Redis 相關類(即你引入了相關依賴)

  • 如果容器里沒有手動注入 RedisTemplate

  • 那就自動幫你注冊一個默認的 RedisTemplate Bean

步驟 4:你就可以在代碼中使用了
@Autowired
private RedisTemplate redisTemplate;

你并沒有顯式配置 Redis 相關的 Bean,但因為自動配置已經做完了,所以直接就能使用。


總結流程圖

@SpringBootApplication↓
@EnableAutoConfiguration↓
AutoConfigurationImportSelector↓
讀取 spring.factories / spring-autoconfigure-metadata↓
加載 xxxAutoConfiguration 類↓
根據條件注冊 Bean(@ConditionalOnClass / OnBean / OnProperty)↓
你就能直接使用這些 Bean

補充:如何自定義或覆蓋自動配置?

  • 如果你自己定義了同名 Bean,比如 RedisTemplate,就會覆蓋自動配置(@ConditionalOnMissingBean 生效)。

  • 想要禁用某個自動配置,可以通過:

spring.autoconfigure.exclude:- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

如果你有某個具體依賴包的例子(比如 MyBatis、Kafka、Elasticsearch),我也可以具體分析它的自動配置鏈路。需要的話隨時說~

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

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

相關文章

一款基于 .NET 8 + Vue 開源的、企業級中后臺權限管理系統

前言 今天大姚給大家分享一款基于 .NET 8 Vue 開源、前后端分離的企業級中后臺權限管理系統&#xff0c;助力快速完成常規業務需求開發&#xff1a;ApeVolo.Admin。 項目介紹 ApeVolo.Admin 一款基于.NET 8、SqlSugar、Vue、Elment UI、RBAC、前后端分離、開源&#xff08;…

vue3騰訊云直播 前端推流

1、在index.html文件中引入&#xff08;在body體中&#xff09; <script src"https://video.sdk.qcloudecdn.com/web/TXLivePusher-2.1.1.min.js" charset"utf-8"></script> 2、vue文件中&#xff0c;添加video推流&#xff08;我用的推流地…

藍疊模擬器過檢測全攻略

BlueStacks藍疊MagiskLsposed安裝和過應用檢測教程 藍疊MagiskLsposed安裝和過應用檢測教程 引言 藍疊模擬器憑借其出色的性能和兼容性&#xff0c;在電腦上運行安卓應用和游戲方面備受青睞。然而&#xff0c;眾多應用和游戲為確保公平性與安全性&#xff0c;加入了模擬器檢測…

Flutter Invalid constant value.

0x00 問題 參數傳入變量&#xff0c;報錯&#xff01; 代碼 const Padding(padding: EdgeInsets.all(20),child: GradientProgressIndicator(value: _progress), ),_progress 參數報錯&#xff1a;Invalid constant value. 0x01 原因 這種情況&#xff0c;多發生于&#xff…

搜廣推校招面經七十一

滴滴算法工程師面經 一、矩陣分解的原理與優化意義 矩陣分解在推薦系統中是一個非常核心的方法&#xff0c;尤其是在 協同過濾(Collaborative Filtering) 中。我們可以通過用戶對物品的評分行為來推測用戶的喜好&#xff0c;從而推薦他們可能喜歡的內容。 1.1. 直觀理解&…

實習技能記錄【2】-----LVGL[基本概念]

LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 應用程序中的頂層容器。它是用戶界面的根對象&#xff0c;所有的可見 UI 元素最終都會添加到某個屏幕上&#xff08;通常是活動屏幕&#xff09;。 功能: 作為其他 UI 元素的父對象。 可以擁有自己的背景顏色、背景圖片等樣…

【c++11】c++11新特性(上)(列表初始化、右值引用和移動語義、類的新默認成員函數、lambda表達式)

&#x1f31f;&#x1f31f;作者主頁&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所屬專欄&#xff1a;C 目錄 前言 一、列表初始化 1. 大括號初始化 2. initializer_list 二、右值引用和移動語義 1. 左值和右值 2. 左值引用和右值引用 引用延長生命周期 左…

軟考中級-軟件設計師 2022年下半年上午題真題解析:通關秘籍+避坑指南

&#x1f4da; 目錄&#xff08;快速跳轉&#xff09; 選擇題&#xff08;上午題&#xff09;&#xff08;每題1分&#xff0c;共75分&#xff09;一、 計算機系統基礎知識 &#x1f5a5;?&#x1f4bb; 題目1&#xff1a;計算機硬件基礎知識 - RISC&#xff08;精簡指令集計算…

基于MCP協議調用的大模型agent開發02

目錄 在AI agent的開發過程中&#xff0c;如何使用mcp服務器作為大模型的工具調用‘百寶箱’&#xff1f; FastAPI FastMCP 本系列&#xff1a; 基于MCP協議調用的大模型agent開發01-CSDN博客 基于MCP協議調用的大模型agent開發02-CSDN博客 在AI agent的開發過程中&#xff0c;…

ES6(8) Fetch API 詳解

1. Fetch API 簡介 fetch 是 ES6 提供的基于 Promise 的 API&#xff0c;用于發送 HTTP 請求并處理服務器響應數據。與傳統的 XMLHttpRequest 相比&#xff0c;fetch 語法更加簡潔&#xff0c;使用 Promise 進行異步處理&#xff0c;避免了回調地獄。 1.1 fetch() 的基本用法 …

原生SSE實現AI智能問答+Vue3前端打字機流效果

實現流程&#xff1a; 1.用戶點擊按鈕從右側展開抽屜&#xff08;drawer&#xff09;&#xff0c;打開模擬對話框 2.用戶輸入問題&#xff0c;點擊提問按鈕&#xff0c;創建一個SSE實例請求后端數據&#xff0c;由于SSE是單向流&#xff0c;所以每提一個問題都需要先把之前的實…

CUDA 工具鏈將全面原生支持 Python

根據 NVIDIA 在 2025 年 GTC 大會上的官宣&#xff0c;CUDA 工具鏈將全面原生支持 Python 編程&#xff0c;這一重大更新旨在降低 GPU 編程門檻&#xff0c;吸引更廣泛的 Python 開發者進入 CUDA 生態。以下是核心信息整合&#xff1a; 1. 原生支持的意義與背景 無需 C/C 基礎…

jupyter notebook 顯示conda虛擬環境

使用 nb_conda_kernels 安裝 nb_conda_kernels&#xff1a;這個包可以自動從你的 Conda 環境中發現并列出內核。 conda activate base # 確保你在 base 環境或任何其他環境中安裝 conda install nb_conda_kernels顯示jupyternotebook當前所在的位置。

【AI】MCP概念

一文講透 MCP&#xff08;附 Apifox MCP Server 內測邀請&#xff09; 7分鐘講清楚MCP是什么&#xff1f;統一Function calling規范&#xff0c;工作量銳減至1/6&#xff0c;人人手搓Manus&#xff01;&#xff1f; | 一鍵鏈接千臺服務器&#xff0c;幾行代碼接入海量外部工具…

WSL1升級到WSL2注意事項

今天要在WSL上安裝docker&#xff0c;因為機器上安裝了wsl1&#xff0c;docker安裝后啟動不了&#xff0c;通過詢問deepseek發現docker只能在wsl2上安裝&#xff0c;因此就想著將本機的wsl1升級到wsl2。 確保你的 Windows 系統是 Windows 10&#xff08;版本 1903 及以上&…

Pycharm常用快捷鍵總結

主要是為了記錄windows下的PyCharm的快捷鍵&#xff0c;里面的操作都試過了功能描述會增加備注。 文件操作 快捷鍵功能描述Ctrl N新建文件Ctrl Shift N根據名稱查找文件Ctrl O打開文件Ctrl S保存當前文件Ctrl Shift S另存為Alt F12打開終端&#xff08;Terminal&…

電池分選機:新能源時代的品質守護者|深圳比斯特自動化

在這個新能源蓬勃發展的時代&#xff0c;電池作為能量的存儲與釋放單元&#xff0c;其性能與質量直接關系到整個系統的穩定運行與效率提升。而電池分選機&#xff0c;作為電池生產流程中的關鍵一環&#xff0c;正扮演著品質守護者的角色&#xff0c;為新能源產業的高質量發展保…

認識 Linux 內存構成:Linux 內存調優之虛擬內存與物理內存

寫在前面 博文內容涉及 Linux 內存構成基本認知包括虛擬內存和物理內存映射,多級頁表和MMU簡單認知理解不足小伙伴幫忙指正對每個人而言,真正的職責只有一個:找到自我。然后在心中堅守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是對大眾理想的…

SCI科學論文的重要組成部分

科學論文的核心結構 科學論文通常遵循IMRAD結構&#xff0c;即&#xff1a; 引言(Introduction)方法(Methods)結果(Results)討論(Discussion) 除此之外&#xff0c;還包括其他幾個關鍵部分。讓我為您詳細介紹每個部分的作用和重要性&#xff1a; 1. 標題(Title) 標題是論文…

期權時間價值與隱含波動率怎么選?

期權隱含波動率與時間價值要怎么選&#xff1f;期權隱含波動率IV對期權價格有著巨大的影響。整體來看&#xff0c;期權隱波與期權價格呈正相關關系。當期權隱波從低水平上升時&#xff0c;期權價格也會相應上漲&#xff1b;反之&#xff0c;當隱波下降&#xff0c;期權價格則會…