【雜類】Spring 自動裝配原理

這張圖,??正是理解現代 Spring Boot 自動配置的鑰匙??。它指出的 AutoConfiguration.imports 文件,是 Spring Boot 2.7 之后的新標準,比老式的 spring.factories 更簡潔。咱們就從這個文件開始說。

一、自動配置是啥?為啥需要它?

想象一下,你想用 Spring MVC 寫個 Web 項目,傳統 Spring 你得自己配 DispatcherServlet、視圖解析器、一堆 XML... 麻煩死了。

Spring Boot 說:“別折騰了,??約定大于配置??!你只要在 pom.xml 里告訴我你要干啥(比如引入 spring-boot-starter-web),剩下的我來!”

自動配置就是這個“剩下的我來”。它基于你項目里的??依賴??(jar 包)、??配置??(application.properties)、??代碼??,自動幫你把 Spring 應用需要的 Bean 都配好。


二、自動配置是怎么動起來的?(工作流程)

整個過程就像工廠的自動化流水線:

??第 1 步:啟動信號 - @SpringBootApplication??
你的主類上的這個注解是個??復合注解??,它封裝了三個核心功能:

  • @SpringBootConfiguration: 標志這是配置類。
  • @ComponentScan: 掃描你寫的 @Component, @Service 等。
  • ??@EnableAutoConfiguration??: 這就是開啟自動配置的??總開關??!最重要!

??第 2 步:大腦與清單 - @EnableAutoConfigurationAutoConfigurationImportSelector??
@EnableAutoConfiguration 注解導入了 AutoConfigurationImportSelector 這個類。它是??大腦??,負責干重活。

大腦需要一份??裝配清單??,才知道要裝配什么。它就會去你項目的類路徑下找這個清單文件:

  1. ??老清單?? (META-INF/spring.factories):Spring Boot 2.6 及以前用的,寫法啰嗦。
  2. ??新清單?? (META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports):??就是你圖片里創建的那個文件!?? Spring Boot 2.7+ 推薦使用,一行一個類名,清爽多了。

??大腦的工作就是讀取這份清單上的所有自動配置類。??

??第 3 步:智能篩選 - 條件注解 (@ConditionalOn...)??
清單上列了上百個自動配置類(比如數據源的、Web 的、安全框架的),難道全給你加載?那不亂套了?

當然不是!每個自動配置類上都有一堆 ??@ConditionalOn...?? ??條件注解??,這就是流水線的??智能檢測傳感器??。

  • ??@ConditionalOnClass(DataSource.class)??:傳感器:“檢測到類路徑下有 DataSource 這個類嗎?(即你引入了 JDBC 依賴)有?那這個數據源配置類可以生效。”
  • ??@ConditionalOnMissingBean??:傳感器:“檢測一下 Spring 容器里,用戶自己配了 DataSource 這個 Bean 嗎?沒配?好,那我來自動配一個。用戶配了?牛逼,用用戶的。” ??這個注解是實現“默認配置”和“用戶覆蓋”的關鍵!??
  • @ConditionalOnProperty:傳感器:“檢測配置文件里,有 spring.datasource.url 這個屬性嗎?有?好,配置生效。”

只有通過了所有傳感器檢測的配置類,才會被真正加載。

??第 4 步:執行裝配 - 配置類里的 @Bean??
一個自動配置類本身就是一個 @Configuration,它內部通過 @Bean 方法,向容器中提供配置好的 Bean。

@Configuration // 這是一個配置類
@ConditionalOnClass(DataSource.class) // 條件:有DataSource類才生效
public class DataSourceAutoConfiguration { // 數據源自動配置類@Bean@ConditionalOnMissingBean // 核心:用戶沒配,我才配!public DataSource dataSource(DataSourceProperties properties) { // 讀取配置屬性// 根據properties里的url, username, password等,創建一個DataSource實例return properties.initializeDataSourceBuilder().build();}
}

三、你圖片的操作:自定義自動配置

你圖片里在 resources 目錄下創建 AutoConfiguration.imports 文件的操作,??意味著你正在參與甚至主導這個自動配置過程!??

??你在做什么???
你是在給你自己的項目(或者你開發的某個 Jar 包)??編寫一份屬于自己的“自動配置清單”??。

??為什么要這么做???

  1. ??深度定制??:你想對某個功能做非常復雜的配置,但又不想把一大堆 @Bean 寫在主應用里,搞得又亂又長。你就可以把這些配置封裝到一個獨立的 MyXxxAutoConfiguration 類中,然后在這個 imports 文件里寫上它。項目一啟動,它就會自動生效。
  2. ??開發自己的 Starter??:這是終極目標!如果你在公司封裝了一套通用組件(比如監控、日志、安全校驗),你希望其他項目只要引入你的依賴,就自動配好一切。那你就是在做一個 ??“自定義 Starter”??。這個 AutoConfiguration.imports 文件就是你 Starter 的“核心清單”,告訴 Spring Boot:“我這個 Jar 包里也有自動配置,啟動時別忘了!”

總結與類比

我們來打個比方,幫你徹底理解:

  • ??Spring Boot 應用?? -> 一家??全自動工廠??
  • ??@SpringBootApplication?? -> 工廠的??總電源開關??
  • ??AutoConfigurationImportSelector?? -> 工廠的??中央控制系統(大腦)??
  • ??AutoConfiguration.imports 文件?? -> 控制系統的??供應商清單??(你圖片里正在創建的就是這個!)
  • ??DataSourceAutoConfiguration?? -> ??“水源供應商”??
  • ??@ConditionalOnClass(DataSource.class)?? -> 供應商的合同條款:“如果工廠需要用水,我就開工”
  • ??@ConditionalOnMissingBean?? -> 條款細則:“如果工廠沒有自己的水井,我才提供自來水”
  • ??最終提供的 DataSource Bean?? -> 供應商送來的??“水”??

工廠(你的應用)一通電啟動,大腦(控制系統)就照著供應商清單(imports 文件),根據合同條款(條件注解),找來所有合適的供應商(自動配置類),讓他們提供物資(Bean)。于是工廠瞬間就擁有了運轉所需的一切。

這就是 Spring Boot 自動配置,它之所以強大,不是因為它會幫你做一切,而是因為它??聰明地、有選擇地??幫你做掉了那些繁瑣的、通用的配置工作,同時??無比尊重你的決定??,隨時準備被你的自定義配置所覆蓋。

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

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

相關文章

【CSS,DaisyUI】自定義選取內容的顏色主題

當你的網站使用了多個主題,比如 light/dark。當用戶選擇一段文本,常常會出現一個主題沒問題,另一個主題顏色怪怪的。是因為選擇區域的主題通常沒有變化,導致與當前主題不配合。 下面四種方法可解決這個問題: The probl…

Linux網絡接口命名詳解:從eth0到ens33

在Linux系統中,網絡接口的命名方式直接影響管理員對設備的理解與管理。從早期的eth0、wlan0到現代的ens33、enp0s3、eno1,Linux網絡接口命名規則經歷了顯著的演變。一、Linux網絡接口命名的歷史與演變 Linux網絡接口命名的歷史可以分為兩個主要時代&…

如何在 FastAPI 中巧妙覆蓋依賴注入并攔截第三方服務調用?

url: /posts/2d992ef9e8962dc0a4a0b5348d486114/ title: 如何在 FastAPI 中巧妙覆蓋依賴注入并攔截第三方服務調用? date: 2025-09-06T03:34:14+08:00 lastmod: 2025-09-06T03:34:14+08:00 author: cmdragon summary: FastAPI 的依賴注入系統允許解耦復雜依賴關系,便于代碼重…

linux上nexus安裝教程

下載頁面 https://help.sonatype.com/en/download.html選擇 Unix/Linux Arch64 一欄點擊下載; 選擇非root 組的用戶登錄linux ,此處注意必須保證linux內存大于4G,否則無法啟動 解壓nexus包 tar -xzvf nexus-3.83.2-01-linux-aarch_64.tar.gz進入bin目錄 …

大語言模型的“思考”邏輯:從Token生成到上下文理解的內部流程

當你問“明天天氣如何”時,AI在“想”什么?當你向ChatGPT或文心一言輸入“明天北京天氣如何”,模型秒速回復“明天北京晴轉多云,氣溫15-25℃”——這個過程看似“思考”,實則是一套精密的“數據處理流水線”。大語言模…

Linux筆記---TCP套接字編程

1. 核心接口 1.1 監聽連接&#xff1a;listen() 使 TCP 套接字進入被動監聽狀態&#xff0c;準備接受客戶端連接&#xff08;僅服務器端使用&#xff09;。 #include <sys/socket.h>int listen(int sockfd, int backlog); 參數&#xff1a; sockfd&#xff1a;已綁定…

從零開始的python學習——文件

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;python學習專欄&#xff1b; 文章目錄 前言 一、文件是什么 二、文件路徑 三、文件操作 &#xff08;1&#xff09;打開文件 …

set與multset的區別;less greater 函數對象實現比較 作為排序依據

Set 和 multiset 特點 set中元素插入過程是按排序規則插入&#xff0c;所以不能指定插入位置。set不可以直接存取元素。&#xff08;不可以使用at.(pos)與[]操作符&#xff09;。multiset與set的區別&#xff1a;set支持唯一鍵值&#xff0c;每個元素值只能出現一次&#xff1b…

計算機視覺(八):開運算和閉運算

計算機視覺中的開運算&#xff08;Opening&#xff09;和閉運算&#xff08;Closing&#xff09;是兩種非常重要的形態學&#xff08;Morphological&#xff09;圖像處理操作。它們主要用于圖像的去噪、分割、特征提取等任務。這兩種運算都基于兩種更基礎的操作&#xff1a;腐蝕…

nginx常用命令(備忘)

一、引言&#xff1a;Nginx 為何成為前端開發必備工具 ** 在前端開發的廣闊領域中&#xff0c;Nginx 已然成為了一個不可或缺的強大工具。它是一款輕量級的 HTTP 服務器和反向代理服務器&#xff0c;采用事件驅動的異步非阻塞處理方式框架&#xff0c;這賦予了它卓越的 I/O 性…

告別Qt Slider!用純C++打造更輕量的TpSlider組件

組件運行效果展示 組件概述 TpSlider組件簡介 TpSlider是PiXSingleGUI庫中的可拖動滑塊組件&#xff0c;支持水平和垂直兩種方向的滑動操作。TpSlider.h:13-17該組件提供了完整的用戶交互功能&#xff0c;包括鼠標拖拽、數值范圍設置和實時反饋機制。 核心特性 雙向支持&am…

sensitive-word 敏感詞性能提升14倍優化全過程 v0.28.0

背景 有一天&#xff0c;群里收到小伙伴提的一個問題&#xff0c;為什么程序 sensitive-word 第一次執行這么慢? sensitive-word-131 初步驗證 自己本地用 v0.27.1 驗證了一下&#xff0c;確實很奇怪&#xff0c;第一次明顯很慢。 為了排除一些干擾項&#xff0c;我們把一些…

4.6 多個光源

1.Include Files 2.The Second Light 3.Point Light1.Include Files 為了在著色器中實現多光源支持, 我們需要添加更多通道; 這些通道會包含幾乎相同的代碼, 為了避免代碼重復, 我們將著色器代碼移到一個包含文件中; 與光照著色器相同的文件夾中創建一個后綴為.cginc的文件, 將…

ANSYS HFSS的簡單認識

HFSS&#xff08;High Frequency Structure Simulator&#xff09;是ANSYS公司開發的一款用于高頻電磁場仿真的行業標準軟件。它通過“計算”電磁波在各種結構中的行為&#xff0c;來幫助工程師設計天線、濾波器、微波電路、高速電子封裝等。我用一個簡單易懂的比喻來幫你理解整…

Codeforces Round 1046 (Div. 2) vp補題

只是簽了三道題就燃盡了… 原題連接 A //不可能連續進三球 得分值差最多的只有00X00X00X00 bool jud(int a,int b){if(a!0&&b!0&&max(a,b)-2*(min(a,b)1)>1)return 0;if(a0||b0){if(abs(a-b)>3)return 0;}return 1; } void solve() {int a,b,c,d;cin…

水泵運行組態監控系統御控物聯網解決方案

一、方案背景與需求分析隨著工業4.0和智慧城市建設的推進&#xff0c;傳統水泵監控方式存在數據孤島、響應滯后、運維成本高等問題。本方案通過物聯網&#xff08;IoT&#xff09;技術構建水泵運行組態監控系統&#xff0c;實現設備狀態實時感知、故障預警、遠程調控及能效優化…

海爾電視刷機

硬盤格式化只有ntfs和exfat怎么辦&#xff0c;沒有fat32 這臺型號le32c31 連有線幾天后突然卡系統啟動中 電視系統崩潰了怎么辦&#xff1f;一直顯示啟動中&#xff01;三分鐘解決問題&#xff0c;只要五元搞定&#xff01;_嗶哩嗶哩_bilibili format H: /fs:FAT32 慢 disk…

Science Advances副主編:如何提高論文投稿接收率?

國際著名綜合性學術期刊《Science Advances》每年可接到約20000份投稿&#xff0c;有高達90%的拒稿率&#xff0c;大部分稿件甚至沒有進入評審階段&#xff0c;作為該期刊的副主編之一&#xff0c;杜克大學的Warren Warren教授撰寫了文章&#xff0c;給投稿人提出幾點建議以提高…

少兒配音教育:廣州聲與色在線科技有限公司打造趣味課程,助力青少年語言能力提升

針對青少年語言表達能力培養需求&#xff0c;廣州聲與色在線科技有限公司推出 “少兒配音趣味課程”&#xff0c;通過動畫、童話等青少年喜愛的形式&#xff0c;融合發聲訓練與興趣培養&#xff0c;成為少兒素質教育的新選擇。課程設計貼合 8-15 歲青少年認知特點&#xff1a;分…

【架構藝術】變更風險防控架構嵌入決策降噪模塊的方法

在先前的文章中&#xff0c;我們聊到了一個變更觀測任務可以通過什么樣的方式對不同的變更防控能力做統一調度&#xff0c;達到優越的變更風險攔截效果。但是在實戰當中&#xff0c;變更觀測任務集成了很多能力&#xff0c;即便風險攔截率很高&#xff0c;但不同能力效果也有差…