深入理解 Spring Boot Starter 的生成機制

在這里插入圖片描述


在使用 Spring Boot 進行開發時,我們常常會引入諸如 spring-boot-starter-webspring-boot-starter-data-jpa 等依賴,從而快速開啟相關功能模塊。但你是否思考過這些 Starter 是如何構建的?如果我們要開發自己的 Starter,又該如何入手?

本文將從原理與實踐兩個角度,詳細解析 Spring Boot Starter 的生成機制,并帶你一步步創建一個自定義 Starter。


一、什么是 Spring Boot Starter?

Spring Boot 的 Starter 本質上是一組 預定義的依賴集合,旨在通過統一封裝常用的配置、Bean 和依賴庫,降低上手成本,提高項目的一致性與開發效率。

常見 Starter 示例:

Starter 名稱功能
spring-boot-starter-web包含 Spring MVC、Jackson、嵌入式 Tomcat 等
spring-boot-starter-data-jpa包含 Spring Data JPA、Hibernate 等
spring-boot-starter-test包含 JUnit、Mockito 等測試庫

本質:

Starter 本質上就是一個 Maven 或 Gradle 的普通依賴,通常由以下結構組成:

  • 自動配置類(@Configuration + @Conditional*
  • Spring Factories 注冊文件
  • 相關依賴

二、Starter 的核心機制原理

1. 自動配置(Auto Configuration)

Spring Boot 的自動配置依賴于兩個核心組件:

  • @EnableAutoConfiguration
  • spring.factories 中配置的自動配置類

Spring Boot 啟動時會掃描依賴中的 META-INF/spring.factories 文件,并加載其中聲明的 EnableAutoConfiguration 類。

# spring-boot-autoconfigure 包中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyServiceAutoConfiguration

2. 條件注解(@Conditional 系列)

Starter 中的自動配置通常不是強制生效的,而是基于條件。例如:

@Configuration
@ConditionalOnClass(MyService.class) // 僅當 classpath 中存在該類時才生效
@ConditionalOnMissingBean(MyService.class) // 若用戶未定義此 bean 時自動配置
public class MyServiceAutoConfiguration {@Beanpublic MyService myService() {return new MyService();}
}

Spring Boot 提供了豐富的條件注解,如:

  • @ConditionalOnClass
  • @ConditionalOnMissingBean
  • @ConditionalOnProperty
  • @ConditionalOnResource

這使得 Starter 能夠根據用戶配置進行動態裝配,具備高度靈活性。


三、自定義 Spring Boot Starter 實踐

1. 創建兩個模塊

我們推薦將 Starter 分為兩個模塊:

(1)my-spring-boot-starter-autoconfigure
  • 包含核心配置類、Bean、spring.factories
  • 不依賴 Spring Boot Starter 本身,便于獨立測試和復用
(2)my-spring-boot-starter
  • 僅引入 my-spring-boot-starter-autoconfigure 與所需依賴(如日志庫、Spring Web 等)
  • 供外部項目使用

2. 編寫自動配置類

@Configuration
@ConditionalOnClass(MyService.class)
@ConditionalOnMissingBean
public class MyServiceAutoConfiguration {@Beanpublic MyService myService() {return new MyService("默認配置");}
}

3. 注冊自動配置類

my-spring-boot-starter-autoconfigureresources/META-INF/spring.factories 文件中:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyServiceAutoConfiguration

Spring Boot 2.7 及以后版本推薦使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

4. 打包發布

分別將 starter-autoconfigurestarter 打成 jar 包,并發布至私服或 Maven 中央庫。


四、整合屬性配置(可選)

為了增強 Starter 的可配置性,可以整合 @ConfigurationProperties

示例:

@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {private String name = "默認名稱";// getter & setter
}@Configuration
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {@Beanpublic MyService myService(MyServiceProperties properties) {return new MyService(properties.getName());}
}

用戶項目中即可通過 application.yml 覆蓋默認配置:

my:service:name: 自定義名稱

五、與 Spring Boot 官方 Starter 的區別

官方 Starter自定義 Starter
功能強大、通用性廣適用于內部統一配置
發布在 Maven Central可發布至公司私服
通常有多個子模塊結構自由,便于維護

六、結語

Spring Boot Starter 是實現模塊化、自動化配置的關鍵利器。通過本篇內容,我們系統性地理解了 Starter 的構建原理及其核心機制,并掌握了開發一個自定義 Starter 的完整流程。

掌握 Starter 的構建技巧,不僅能提升開發效率,也為你在團隊中構建標準化基礎組件打下堅實基礎。


附:自定義 Starter 項目結構示意

my-spring-boot-starter/
├── my-spring-boot-starter/
│   └── pom.xml (依賴 my-spring-boot-starter-autoconfigure)
└── my-spring-boot-starter-autoconfigure/├── src/main/java/│   └── com/example/autoconfig/│       ├── MyServiceAutoConfiguration.java│       └── MyServiceProperties.java├── src/main/resources/│   └── META-INF/│       └── spring.factories└── pom.xml

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

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

相關文章

阿里云-通義靈碼:隱私保護機制—為數據安全筑起銅墻鐵壁

免責聲明:此篇文章所有內容皆是本人實驗,并非廣告推廣,并非抄襲,該系列繼續~每日一句不要感嘆自己的平凡,即便是最暗的星星,相與無邊的黑暗已是耀眼。一.引言在這個數據如同空氣般滲透到生活每個角落的時代…

最小生成樹算法詳解

最小生成樹算法詳解一、最小生成樹基礎概念1.1 生成樹與最小生成樹1.2 核心性質1.3 應用場景二、Prim 算法:從頂點出發的“生長式”構建2.1 算法原理2.2 Java 代碼實現(鄰接矩陣版)2.3 復雜度分析三、Kruskal 算法:按邊權排序的“…

YOLO 目標檢測的改進方法

YOLO目標檢測的改進方法可以從模型架構、訓練策略、損失函數等多個方面入手,以下是一些常見的改進方法方向及參考文獻: 模型架構改進 骨干網絡替換:使用更輕量或更強大的網絡替換原始骨干網絡。輕量級網絡如MobileNetV3、ShuffleNetV2等適合…

C++ 程序 AddressSanitizer:DEADLYSIGNAL

GCC && G 操作系統:Ubuntu 22.04 現象:C程序編譯時開啟ASAN,運行時有幾率會出現大量AddressSanitizer:DEADLYSIGNAL 參考文章: https://stackoverflow.com/questions/77894856/possible-bug-in-gcc-sanitizers https://st…

【強化學習】實際部署

環境 Gymnasium 作為環境接口, PyBullet作為物理仿真平臺, Stable Baselines3 用于訓練算法。 測試框架搭建 以pybullet自帶的Cart-pole-v1為例 安裝依賴:確保安裝了 Gymnasium 和 SB3 ( pip install gymnasium stable-baselines3 ).初始化環…

集訓Demo4

創建數據庫創建項目基本和視頻中的一樣我給User添加了vip這個屬性,想實現兩個令牌通過訪問的案例,但遇到了問題一個令牌是密碼加用戶名的map數組這是它的獲取、驗證邏輯獲取驗證另一個令牌是Int vip這是自己寫的另一套密鑰和方法獲取但在驗證這里有問題頭…

深度優化:Java 慢查詢排查與性能調優實戰

文章目錄🚀 深度優化:Java 慢查詢排查與性能調優實戰🚨1. 事故全景:從告警到定位🕵??♂?1.1 事故時間線📊 1.2 關鍵指標異常🛠? 1.3 排查工具鏈🔍 2. 深度剖析:MySQL…

TF-IDF(Term Frequency - Inverse Document Frequency)

TF-IDF(Term Frequency - Inverse Document Frequency)是一種在信息檢索與文本挖掘中非常常用的關鍵詞提取方法,用于衡量一個詞在文檔集合中的重要性。它的核心思想是:如果一個詞在某個文檔中出現得頻繁,同時在其他文檔…

Chrome緊急更新,谷歌修復正遭活躍利用的關鍵零日漏洞

谷歌已針對桌面版Chrome發布重要穩定渠道更新(版本138.0.7204.157/.158),修復了六個安全漏洞,其中包括一個已被實際利用的漏洞。該更新正在向Windows、Mac和Linux平臺推送,預計未來數日或數周內將通過自動更新完成部署…

Typecho插件開發:實現文章字數統計與閱讀時長計算功能

文章目錄 Typecho文章字數統計與閱讀時長計算功能實現指南 1. 功能背景與需求分析 2. 插件設計與實現 2.1 插件基礎結構 2.2 插件主邏輯實現 2.3 代碼解析與優化 3. 前端展示優化 3.1 CSS樣式增強 3.2 多語言支持 4. 高級功能擴展 4.1 數據庫表優化 4.2 定時批量處理歷史文章 5…

開源短鏈接工具 Sink 無需服務器 輕松部署到 Workers / Pages

本文首發于只抄博客,歡迎點擊原文鏈接了解更多內容。 前言 Sink 是一款開源免費的短鏈接生成工具,支持自定義短鏈接 Slug 以及設置到期時間,并且還可以借助 Cloudflare 的 Analytics Engine 功能分析短鏈接的統計數據。 最重要的是實現以上這些功能并不需要有自己的服務器,…

嵌入式數據結構之順序表總結

以下是為嵌入式面試準備的順序表全面優化指南,結合高頻考點、代碼規范與嵌入式專項優化技巧,助你系統掌握該知識點。 一、順序表基礎與嵌入式特點 ?本質? 用連續內存空間存儲線性表元素,通過下標實現O(1)隨機訪問 。 ?嵌入式優勢?&#x…

Pytorch下載Mnist手寫數據識別訓練數據集的代碼詳解

datasets.MNIST(root./data, trainFalse, downloadTrue, transformtransforms.ToTensor())1. datasets.MNIST這是torchvision.datasets模塊中的一個類,專門用于加載MNIST數據集。MNIST是一個著名的手寫數字識別數據集,包含60,000個訓練樣本和10,000個測試…

汽車免拆診斷案例 | 07款豐田Hilux啟動故障

故障現象一輛 2007 年的豐田Hilux 2.5L柴油手動擋,行駛里程為23萬公里。車主說車輛有很多故障,包括故障燈閃爍、發動機啟動后又熄火、短時間運行時發動機還會劇烈抖動異響,從排氣管冒出大量煙霧。故障診斷接車之后進行檢查,發現發…

黃老師(Exeter University)學術交流

1. 文章結構與核心貢獻聚焦 強調明確切入點和核心“亮點”貢獻,避免分散,確保至少一項最主要、富有創新的方法。在該貢獻點上進行全面充分的實驗驗證,包括不同模型尺寸、普適性測試,以應對審稿專家的質疑。建議從讀者或審稿人角度…

ArcGIS Pro+PS 實現地形渲染效果圖

先前關注了B站和小紅書博主,設計暴風眼,大神講的確實好,深感佩服,自己以前的制圖僅僅實現了制圖,實現了把圖放在論文里能湊合,而不是設計。最近抽時間學習了一下大神的合集:ArcGIS Pro實用技法合…

ollma dify 搭建合同審查助手

目錄 windows dify: ollma 配置 ollma下載地址: qwen3 模型下載 這個自動下載,下載后自動運行。 配置環境變量:修改監聽后很慢 測試命令: 模型配置url: 搭建工作流 windows dify: 下載 dify代碼&#xff1a…

解鎖 iOS 按鍵精靈輔助工具自動化新可能:iOSElement.Click 讓元素交互更簡單

在移動自動化測試與腳本開發領域,精準操控應用元素是核心需求。無論是自動化測試流程、批量操作處理,還是場景化腳本開發,能否可靠地點擊指定元素直接決定了自動化任務的成敗。在 iOS 自動化操作中,開發者常常面臨三大痛點&#x…

【機器學習】AdamW可調參數介紹及使用說明

在 AdamW 算法中調整參數對模型訓練過程和最終效果有直接且重要的影響,以下是各關鍵參數對性能的具體影響總結:AdamW 主要可調參數及其影響說明 1. 學習率 lr 影響: 太大(如 0.01 ~ 0.1):訓練過程不穩&…

第一篇htmlcss詳細講解

第一章 HTML標簽介紹 第一節 HTML基本結構 <!DOCTYPE html> <html><head><title>標題</title></head><body>文檔主體</body></html> HTML 標簽是由<>包圍的關鍵詞,例:<html> HTML 標簽通常成對出現,分…