【Spring篇08】:理解自動裝配,從spring.factories到.imports剖析

文章目錄

  • 1. 自動化裝配的起點:`@SpringBootApplication`
  • 2. 自動化裝配的核心機制:`@EnableAutoConfiguration` 和 `AutoConfigurationImportSelector`
  • 3. 自動化配置的注冊方式:`spring.factories` 與 `.imports`
    • 3.1 早期版本:`META-INF/spring.factories`
    • 3.2 現代版本:`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`
  • 4. 運行時類路徑:自動化配置的基礎
  • 5. 條件判斷:決定配置是否生效
  • 6. 總結

Spring Boot 自動化裝配是其最引人注目的特性之一,它極大地簡化了 Spring 應用的配置,讓開發者能夠更專注于業務邏輯本文將帶深入探討 Spring Boot 自動化裝配的原理,并回顧其從早期版本到現代版本的演進過程

1. 自動化裝配的起點:@SpringBootApplication

每個 Spring Boot 應用的入口點通常都有一個 @SpringBootApplication 注解這個復合注解是自動化裝配的起點,它集成了三個核心注解:

  • @SpringBootConfiguration: 標記當前類為配置類,等同于 @Configuration
  • @EnableAutoConfiguration: 開啟 Spring Boot 自動化裝配的關鍵注解
  • @ComponentScan: 開啟組件掃描,用于發現和注冊應用內的 Bean

其中,@EnableAutoConfiguration 是自動化裝配的核心


2. 自動化裝配的核心機制:@EnableAutoConfigurationAutoConfigurationImportSelector

@EnableAutoConfiguration 注解內部通過 @Import 注解導入了一個名為 AutoConfigurationImportSelector 的類

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class}) // 核心在這里!
public @interface EnableAutoConfiguration {// ...
}

AutoConfigurationImportSelector 的主要職責是在應用啟動時,找到并加載所有符合條件的自動化配置類


3. 自動化配置的注冊方式:spring.factories.imports

Spring Boot 自動化配置類并不是隨便放在項目中的,它們需要被“注冊”起來,以便 AutoConfigurationImportSelector 能夠發現它們在 Spring Boot 的不同版本中,注冊方式有所演進

3.1 早期版本:META-INF/spring.factories

在 Spring Boot 2.7 版本之前,自動化配置類主要通過 META-INF/spring.factories 文件進行注冊這個文件位于 JAR 包的 META-INF 目錄下,遵循 Java 的 Service Provider Interface (SPI) 機制

spring.factories 是一個屬性文件,其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 鍵對應的值就是自動化配置類的全限定名列表,用逗號分隔

# 示例:早期版本 Starter 中的 META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

AutoConfigurationImportSelector 在早期版本中主要依賴 SpringFactoriesLoader 工具類來讀取這些 spring.factories 文件SpringFactoriesLoader 會掃描當前應用的整個運行時類路徑,查找所有 JAR 包中的 META-INF/spring.factories 文件,并加載指定鍵對應的值

3.2 現代版本:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

從 Spring Boot 2.7 版本開始,為了使自動化配置的注冊更加清晰和規范,引入了 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 這個專門用于注冊自動化配置類的文件

這個文件每行包含一個自動化配置類的全限定名

# 示例:現代版本 Starter 中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

在 Spring Boot 2.7+ 版本中,AutoConfigurationImportSelector 會同時從 spring.factories.imports 文件中加載自動化配置類如我們之前分析的 getCandidateConfigurations 方法所示:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {// 從 spring.factories 加載List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));// 從 .imports 文件加載 (Spring Boot 2.7+ 新增)ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);// ... 檢查是否找到配置類return configurations;
}

在 Spring Boot 3.x 版本中,.imports 文件成為了主要和推薦的自動化配置注冊方式


4. 運行時類路徑:自動化配置的基礎

無論是 spring.factories 還是 .imports 文件,AutoConfigurationImportSelector 能夠找到它們的前提是它們所在的 JAR 包存在于應用的 運行時類路徑 (Runtime Classpath)

運行時類路徑是 JVM 在運行的 Java 應用程序時,用來查找和加載 .class 文件的路徑集合它包括:

  • 自己的項目編譯輸出的 .class 文件
  • 項目依賴的所有 JAR 包
  • JDK 自帶的類庫

SpringFactoriesLoaderImportCandidates 工具類正是利用了 JVM 的類加載機制,遍歷整個運行時類路徑,查找指定位置的資源文件當通過 Maven 或 Gradle 引入一個 Spring Boot Starter 或其他包含自動化配置的 JAR 包時,這個 JAR 包就會被添加到的運行時類路徑中,從而使得其中的 spring.factories.imports 文件能夠被 Spring Boot 發現


5. 條件判斷:決定配置是否生效

找到自動化配置類只是第一步Spring Boot 的自動化裝配之所以智能,是因為它會根據當前應用程序的環境來決定哪些配置類應該真正生效這個決策過程依賴于一系列的條件注解

這些條件注解通常加在自動化配置類或其中的 @Bean 方法上常見的條件注解包括:

  • @ConditionalOnClass: 當指定的類存在于運行時類路徑中時生效
  • @ConditionalOnMissingBean: 當 Spring 容器中不存在指定類型的 Bean 時生效
  • @ConditionalOnProperty: 當指定的配置屬性存在且符合指定值時生效
  • @ConditionalOnResource: 當指定的資源文件存在于類路徑中時生效
  • @ConditionalOnWebApplication: 當應用程序是 Web 應用時生效
  • 等等…

AutoConfigurationImportSelector 在加載了候選的自動化配置類名后,會進一步檢查這些類上的條件注解只有當所有條件注解都滿足時,這個自動化配置類才會被激活,其中的 Bean 定義才會被注冊到 Spring 容器中

舉例來說:

如果引入了 spring-boot-starter-data-redis 依賴,那么 Redis 相關的 JAR 包會出現在的運行時類路徑中,其中包含 RedisOperations.class 等類spring-boot-autoconfigure 模塊中的 RedisAutoConfiguration 類上帶有 @ConditionalOnClass({ RedisOperations.class, RedisConnectionFactory.class }) 注解因為這些類存在,條件滿足,RedisAutoConfiguration 生效,Spring Boot 自動為配置 Redis 相關的 Bean

如果沒有引入該依賴,這些類不存在,條件不滿足,RedisAutoConfiguration 被忽略


6. 總結

Spring Boot 自動化裝配是一個強大而智能的特性,它通過以下機制實現:

  • @EnableAutoConfiguration: 開啟自動化裝配
  • AutoConfigurationImportSelector: 核心選擇器,負責查找和加載自動化配置類
  • 注冊文件 (spring.factories.imports): 聲明哪些類是自動化配置類,位于 JAR 包的特定位置
  • 運行時類路徑: 這些注冊文件必須存在于應用的運行時類路徑中才能被發現
  • 條件注解 (@ConditionalOnClass 等): 根據當前環境決定自動化配置是否生效

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

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

相關文章

前置代理重構網絡訪問的「中轉站」

某跨境電商通過前置代理構建賬號隔離體系&#xff0c;將亞馬遜店鋪關聯風險降低85%&#xff1b;某企業利用前置代理過濾惡意流量&#xff0c;網絡攻擊攔截率提升70%。在復雜的網絡環境中&#xff0c;前置代理作為客戶端與目標服務器之間的「中間樞紐」&#xff0c;正成為跨境訪…

樂鑫代理商飛睿科技,2025年AI智能語音助手市場發展趨勢與樂鑫芯片解決方案分析

一、市場現狀與技術背景進入2025年&#xff0c;AI智能語音助手市場呈現出爆發性增長態勢。全球AI應用訪問量從2024年初的36億次激增至76億次&#xff0c;增幅高達111%&#xff0c;其中語音交互類產品貢獻了顯著份額。在企業市場&#xff0c;語音技術已從“增值服務”轉變為不可…

App爬蟲工具篇-Appium安裝

之前在另外一篇文章App爬蟲工具篇-mitmproxy簡單介紹了利用mitmproxy進行接口攔截來獲取接口數據。但是很多軟件現在都會對相關接口進行加密。如以下我用mitmproxy攔截到接口流量樣例: {"raw_data": "EXMcAezXPq/MRC1m2mJIG/EQLisaahfpjPTj9svrxe6yLI8mZTvW4+…

容器與 Kubernetes 基本概念與架構

文章目錄 1. 典型環境層次結構2. Kubernetes 生態三大類2.1 核心組件2.2 集群管理工具2.3 生態輔助工具2.4 資源管理關系 3. Docker 容器技術與實踐3.1 鏡像拉取加速3.2 認證與登錄3.3 常用命令3.4 存儲掛載方式對比3.5 docker-compose 啟動3.6 容器化應用部署示例 4. kind 快速…

Ajax和Axios的初步學習

Ajax 一、什么是 Ajax&#xff1f; Ajax (Asynchronous JavaScript and XML) 是一種無需重新加載整個網頁的情況下&#xff0c;能夠更新部分網頁的技術。通過在后臺與服務器進行少量數據交換&#xff0c;Ajax 可以使網頁實現異步更新。 主要特性&#xff1a; 異步性 (Asynch…

C#指針:解鎖內存操作的底層密碼

C#指針&#xff1a;解鎖內存操作的底層密碼 在 C# 的世界里&#xff0c;我們習慣了托管代碼帶來的安全與便捷 —— 垃圾回收器自動管理內存&#xff0c;類型系統嚴格檢查數據操作&#xff0c;就像在精心維護的花園中漫步&#xff0c;無需擔心雜草與荊棘。但當性能成為關鍵瓶頸…

永洪科技榮獲商業智能品牌影響力獎,全力打造”AI+決策”引擎

近日&#xff0c;在備受業界矚目的年度商業智能領域權威評選中&#xff0c;永洪科技憑借卓越的技術實力、深度的客戶價值創造能力與前瞻的行業洞察&#xff0c;成功斬獲“2025商業智能品牌影響力獎”。這一獎項不僅是對永洪科技市場地位與品牌聲量的高度認可&#xff0c;更是對…

在SSM+vue項目中上傳表單數據和文件

從前端向后端發送multipart/form-data 類型數據&#xff08;主要用于文件上傳或表單提交&#xff09;如發送如下信息&#xff1a;前端代碼vue文件&#xff1a;&#xff08;配置了服務器代理&#xff09;<template><div class"content"><el-form :mode…

Python 機器學習核心入門與實戰進階 Day 1 - 分類 vs 回歸

? 今日目標 理解分類&#xff08;Classification&#xff09;與回歸&#xff08;Regression&#xff09;的本質區別掌握兩種任務的典型使用場景學會根據任務類型選擇合適的模型了解每類模型對應的評估指標 &#x1f4d8; 一、監督學習的兩大任務類型 任務類型輸出結果典型問…

RPC--自定義注解注冊發布服務

自定義的三個注解1、RpcReference這個注解用于修飾類的某個字段&#xff0c;表示這個字段是遠程調用的引用下面詳細解釋下這個字段的定義Document表示這個注解應該被javadoc文檔工具記錄&#xff0c;生成API文檔時使用了該注解的地方會被顯示出來Retention表示這個注解的聲明周…

Web 3D可視化引擎HOOPS Communicator,高效賦能工業級應用開發!

在數字化轉型加速的今天&#xff0c;企業面臨著前所未有的挑戰——如何高效管理跨平臺的設計數據、提升團隊協作效率&#xff0c;并加快產品上市速度。HOOPS Communicator作為一款高性能的3D可視化與共享平臺&#xff0c;憑借其強大的兼容性、先進的3D渲染引擎和無縫的協作功能…

OceanBase數據庫遷移工具介紹和部署

OceanBase數據庫遷移工具介紹和部署核心組件遷移支持部署要求單節點部署查看日志OceanBase 遷移服務&#xff08;OceanBase Migration Service, OMS&#xff09;是OceanBase數據庫提供的一種支持同構或異構數據源與OceanBase數據庫之間進行數據交互的服務&#xff0c;具備在線遷…

棧與隊列:算法基礎的核心差異

理解棧和隊列的異同對打好算法基礎太重要了&#xff01;它們都是編程和算法中無處不在的線性數據結構&#xff0c;核心區別在于操作數據的順序。下面我來幫大家清晰梳理它們的異同點&#xff1a;一、相同點都是線性數據結構&#xff1a;數據元素之間邏輯上呈現“一個接一個”的…

HCIA-生成數協議(STP)

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 ? 本篇筆記是根據B站上的視頻教程整理而成&#xff0c;感謝UP主的精彩講解&#xff01;如果需要了解更多細節&#xff0c;可以參考以下視頻&#xf…

基于內網穿透技術的Stable+Diffusion+3.5本地化部署與遠程圖像生成架構

文章目錄 前言1. 本地部署ComfyUI2. 下載 Stable Diffusion3.5 模型3. 演示文生圖4. 公網使用Stable Diffusion 3.5 大模型4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 在數字內容創作行業中&#xff0c;利用本地化服務器進行人工智能部署的策略正逐步成為優化制作…

私有云平臺實戰-OpenStack入門體驗

目錄 #1.1云計算概述 1.1.1什么是云計算 1.1.2云計算的服務模型 1.1.3OpenStack概述 #2.1OpenStack一鍵部署 2.1.1在線安裝 2.1.2使用本地倉庫離線安裝 2.1.3創建云主機 1.1云計算概述 云計算是一種基于互聯網的計算方式&#xff0c;通過網絡將共享的軟硬件資源和信息按需提供…

專題:2025即時零售與各類人群消費行為洞察報告|附400+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42808 即時零售的崛起正在重塑消費市場的時間與空間邊界。從清晨的第一杯咖啡到深夜的應急零食&#xff0c;消費者的需求不再受限于傳統營業時間。與此同時&#xff0c;不同人群的消費習慣呈現出鮮明差異&#xff0c;Z世代沉迷線上娛…

【一起來學AI大模型】算法核心:數組/哈希表/樹/排序/動態規劃(LeetCode精練)

以下是五大核心算法的重點解析和LeetCode經典題解&#xff0c;包含最優解法和模板代碼&#xff1a;一、數組操作&#xff08;雙指針/滑動窗口&#xff09;核心思想&#xff1a;通過索引指針高效遍歷與操作數組1. 移動零&#xff08;No.283&#xff09;def moveZeroes(nums):slo…

CSS之基礎語法一文全解析

CSS之基礎語法一文全解析 一、CSS語法核心結構&#xff1a;選擇器聲明塊1.1 基礎語法模板1.2 關鍵組成部分 二、選擇器全解析&#xff1a;精準定位目標元素2.1 基礎選擇器&#xff08;必掌握&#xff09;2.1.1 標簽選擇器&#xff08;類型選擇器&#xff09;2.1.2 類選擇器&…

vue 前端動態導入文件 import.meta.glob 導入圖片

背景&#xff1a; 在開發過程中&#xff0c;前端會引入資源文件&#xff0c;這里主要是引入圖片。在開發環境&#xff0c;導入的圖片顯示正常&#xff0c;但是打包部署后&#xff0c;導入的圖片就不能正常顯示。 原因分析&#xff0c;可能有如下幾點&#xff1a; 1.圖片不能顯示…