Spring Boot自動裝配:約定大于配置的魔法解密

#### 一、自動裝配的哲學思考

在傳統Spring應用中,開發者需要手動配置大量的XML或JavaConfig。Spring Boot通過自動裝配機制實現了**約定大于配置**的設計理念,其核心思想可以概括為:

1. **智能預設**:基于類路徑檢測自動配置
2. **條件裝配**:通過`@Conditional`系列注解實現動態決策
3. **漸進增強**:允許開發者自定義配置覆蓋默認值

#### 二、自動裝配的核心實現原理

##### 2.1 啟動類解剖
```java

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}


```
- `@SpringBootApplication`是組合注解,包含:
? - `@SpringBootConfiguration`:標記主配置類
? - `@EnableAutoConfiguration`:啟用自動配置
? - `@ComponentScan`:組件掃描

##### 2.2 自動配置觸發流程
1. **加載候選配置**:讀取所有jar包的`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`
2. **條件過濾**:通過114+種條件注解篩選有效配置類
3. **Bean注冊**:將符合條件的配置類中定義的Bean加入容器

#### 三、源碼級實現解析

##### 3.1 自動配置入口

`SpringApplication.run()` → `refreshContext()` → `invokeBeanFactoryPostProcessors()`

關鍵類:
- `AutoConfigurationImportSelector`:負責加載候選配置
- `ConditionEvaluator`:執行條件判斷

##### 3.2 條件判斷示例
```java

@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {// 根據條件創建不同的DataSource
}


```
常見條件注解:
- `@ConditionalOnClass`:類路徑存在指定類時生效
- `@ConditionalOnMissingBean`:容器不存在指定Bean時生效
- `@ConditionalOnProperty`:配置參數匹配時生效

#### 四、自動配置調試技巧

##### 4.1 查看生效配置
```properties
# application.properties
debug=true
```
啟動時輸出:
```

Positive matches:
-----------------DataSourceAutoConfiguration matched:- @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)Negative matches:
-----------------ActiveMQAutoConfiguration:Did not match:- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)
```

##### 4.2 自定義排除配置
```java

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,SecurityAutoConfiguration.class
})


```

#### 五、自定義Starter開發實戰

##### 5.1 創建自動配置類
```java

@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService(MyServiceProperties properties) {return new MyService(properties);}
}


```

##### 5.2 注冊配置
```text
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.MyServiceAutoConfiguration
```

##### 5.3 屬性配置支持
```java

@ConfigurationProperties("my.service")
public class MyServiceProperties {private String endpoint;private int timeout = 5000;// getters/setters
}


```

#### 六、自動裝配的底層支撐

##### ?條件評估決策樹
```j

public abstract class SpringBootCondition implements Condition {public final boolean matches(...) {ConditionOutcome outcome = getMatchOutcome(...);return outcome.isMatch();}// 抽象方法由具體條件類實現
}


```

#### 七、最佳實踐與避坑指南

1. **配置覆蓋策略**
? ?- 優先使用`application.properties`配置
? ?- 慎用`@Primary`注解覆蓋自動配置Bean

2. **啟動優化技巧**
? ?```

? ?// 精確控制自動配置加載@ImportAutoConfiguration({DataSourceAutoConfiguration.class,WebMvcAutoConfiguration.class})


? ?```

3. **常見問題排查**
? ?- 使用`--debug`參數分析配置加載
? ?- 檢查依賴沖突導致的類路徑異常
? ?- 監控`ConditionEvaluationReport`日志

#### 八、設計模式啟示

1. **工廠方法模式**:通過`AutoConfigurationImportSelector`實現配置加載
2. **策略模式**:不同的`Condition`實現對應不同判斷策略
3. **觀察者模式**:`ConfigurationClassPostProcessor`處理配置變化

#### 結語

Spring Boot的自動裝配機制如同精密的瑞士手表,將約定優先原則與條件化配置完美結合。理解其實現原理不僅能幫助開發者更好地駕馭框架,更能啟發我們設計出具有良好擴展性的系統架構。當你下次啟動Spring Boot應用時,不妨想象背后這數百個條件判斷如同精密齒輪般協同工作的美妙場景。

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

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

相關文章

Fiddler筆記

文章目錄 一、與F12對比二、核心作用三、原理四、配置1.Rules:2.配置證書抓取https包3.設置過濾器4、抓取App包 五、模擬弱網測試六、調試1.線上調試2.斷點調試 七、理論1.四要素2.如何定位前后端bug 注 一、與F12對比 相同點: 都可以對http和https請求進行抓包分析…

Python爬蟲-貓眼電影的影院數據

前言 本文是該專欄的第46篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文筆者以貓眼電影為例子,獲取貓眼的影院相關數據。 廢話不多說,具體實現思路和詳細邏輯,筆者將在正文結合完整代碼進行詳細介紹。接下來,跟著筆者直接往下看正文詳細內容。(附帶完整代碼) …

linux筆記:shell中的while、if、for語句

在Udig軟件的啟動腳本中使用了while循環、if語句、for循環,其他內容基本都是變量的定義,所以嘗試弄懂腳本中這三部分內容,了解腳本執行過程。 (1)while循環 while do循環內容如下所示,在循環中還用了expr…

利用分治策略優化快速排序

1. 基本思想 分治快速排序(Quick Sort)是一種基于分治法的排序算法,采用遞歸的方式將一個數組分割成小的子數組,并通過交換元素來使得每個子數組元素按照特定順序排列,最終將整個數組排序。 快速排序的基本步驟&#…

從零到一實現微信小程序計劃時鐘:完整教程

在本教程中,我們將一起實現一個微信小程序——計劃時鐘。這個小程序的核心功能是幫助用戶添加任務、設置任務的時間范圍,并且能夠刪除和查看已添加的任務。通過以下步驟,我們將帶你從零開始實現一個具有基本功能的微信小程序計劃時鐘。 項目…

idea日常報錯之UTF-8不可映射的字符

目錄 一、UTF-8不可映射的字符的解決 1、出現這種報錯的情形 2、具體解決辦法 前言: 在我們日常代碼編寫的時候可能會遇到各式各樣的錯誤,有時候并不是你改動了代碼,而是莫名其妙就出現的報錯,今天我就遇到一個在maven編譯的時候…

人工智能技術-基于長短期記憶(LSTM)網絡在交通流量預測中的應用

人工智能技術-基于長短期記憶(LSTM)網絡在交通流量預測中的應用 基于人工智能的智能交通管理系統 隨著城市化進程的加快,交通問題日益嚴峻。為了解決交通擁堵、減少交通事故、提高交通管理效率,人工智能(AI&#xff…

HTTP FTP SMTP TELNET 應用協議

1. 標準和非標準的應用協議 標準應用協議: 由標準化組織(如 IETF,Internet Engineering Task Force)制定和維護,具有廣泛的通用性和互操作性。這些協議遵循嚴格的規范和標準,不同的實現之間可以很好地進行…

Matlab離線安裝硬件支持包的方法

想安裝支持樹莓派的包,但是發現通過matlab安裝需要續訂維護服務 可以通過離線的方式安裝。 1. 下載SupportSoftwareDownloader Support Software Downloader - MATLAB & Simulink 登錄賬號 選擇對應的版本 2. 選擇要安裝的包 3.將下載的包copy到安裝目錄下 …

Django REST Framework (DRF) 中用于構建 API 視圖類解析

Django REST Framework (DRF) 提供了豐富的視圖類,用于構建 API 視圖。這些視圖類可以分為以下幾類: 1. 基礎視圖類 這些是 DRF 中最基礎的視圖類,通常用于實現自定義邏輯。 常用類 APIView: 最基本的視圖類,所有其…

MyBatis攔截器終極指南:從原理到企業級實戰

在本篇文章中,我們將深入了解如何編寫一個 MyBatis 攔截器,并通過一個示例來展示如何在執行數據庫操作(如插入或更新)時,自動填充某些字段(例如 createdBy 和 updatedBy)信息。本文將詳細講解攔…

137,【4】 buuctf web [SCTF2019]Flag Shop

進入靶場 都點擊看看 發現點擊work會增加¥ 但肯定不能一直點下去 抓包看看 這看起來是一個 JWT(JSON Web Token)字符串。JWT 通常由三部分組成,通過點(.)分隔,分別是頭部(Header&…

twisted實現MMORPG 游戲數據庫操作封裝設計與實現

在設計 MMORPG(大規模多人在線角色扮演游戲)時,數據庫系統是游戲架構中至關重要的一部分。數據庫不僅承擔了游戲中各種數據(如玩家數據、物品數據、游戲世界狀態等)的存儲和管理任務,還必須高效地支持并發訪…

【R語言】聚類分析

聚類分析是一種常用的無監督學習方法,是將所觀測的事物或者指標進行分類的一種統計分析方法,其目的是通過辨認在某些特征上相似的事物,并將它們分成各種類別。R語言提供了多種聚類分析的方法和包。 方法優點缺點適用場景K-means計算效率高需…

超全Deepseek資料包,deepseek下載安裝部署提示詞及本地部署指南介紹

該資料包涵蓋了DeepSeek模型的下載、安裝、部署以及本地運行的詳細指南,適合希望在本地環境中高效運行DeepSeek模型的用戶。資料包不僅包括基礎的安裝步驟,還提供了68G多套獨立部署視頻教程教程,針對不同硬件配置的模型選擇建議,以…

Java Spring boot 篇:常用注解

Configuration 作用 Configuration 注解的核心作用是把一個類標記為 Spring 應用上下文里的配置類。配置類就像一個 Java 版的 XML 配置文件,能夠在其中定義 Bean 定義和 Bean 之間的依賴關系。當 Spring 容器啟動時,會掃描這些配置類,解析其…

在 Ubuntu 20.04 為 Clash Verge AppImage 創建桌面圖標教程

在 Ubuntu 20.04 為 AppImage 創建桌面圖標教程 一、準備工作 確保你已經下載了 xxxx.AppImage 文件,并且知道它所在的具體路徑。同時,你可以準備一個合適的圖標文件(.png 格式)用于代表該應用程序,如果沒有合適的圖…

【復現DeepSeek-R1之Open R1實戰】系列6:GRPO源碼逐行深度解析(上)

目錄 4 GRPO源碼分析4.1 數據類 GRPOScriptArguments4.2 系統提示字符串 SYSTEM_PROMPT4.3 獎勵函數4.3.1 accuracy_reward函數4.3.2 verify函數4.3.3 format_reward函數 4.4 將數據集格式化為對話形式4.5 初始化GRPO Trainer 【復現DeepSeek-R1之Open R1實戰】系列3&#xff1…

【雜談】加油!!!!

為了在三月底前系統準備Java后端開發的面試和筆試,以下是分階段的高效學習計劃: 一、知識體系構建(第1-2周) 核心基礎強化 Java基礎(每日1.5小時): 重點掌握:JVM內存模型&#xff0…

python旅游推薦系統+爬蟲+可視化(協同過濾算法)

??基于用戶的協同過濾算法 ??有后臺管理 ??2w多數據集 這個旅游數據分析推薦系統采用了Python語言、Django框架、MySQL數據庫、requests庫進行網絡爬蟲開發、機器學習中的協同過濾算法、ECharts數據可視化技術,以實現從網站抓取旅游數據、個性化推薦和直觀展…