【Spring篇09】:制作自己的spring-boot-starter依賴1

文章目錄

  • 1. Spring Boot Starter 的本質
  • 2. Starter 的模塊結構(推薦)
  • 3. 制作 `xxx-spring-boot-autoconfigure` 模塊
    • 3.1 添加必要的依賴
    • 3.2 編寫具體功能的配置類
    • 3.3 編寫自動化配置類 (`@AutoConfiguration`)
    • 3.4 注冊自動化配置類 (`.imports` 或 `spring.factories`)
  • 4. 制作 `xxx-spring-boot-starter` 模塊
  • 5. 使用你的 Starter 依賴
  • 6. 最佳實踐和注意事項
  • 總結

在企業級應用開發中,我們經常會遇到一些通用的功能模塊,比如統一的日志處理、RPC 調用客戶端、特定的安全認證邏輯等如果每個項目都重復編寫這些配置和代碼,效率低下且容易出錯

Spring Boot Starter 的出現,正是為了解決這個問題。Starter 是一種特殊的 Maven 或 Gradle 依賴,它能夠將相關的依賴和自動化配置打包在一起,讓其他項目只需要簡單地引入一個 Starter 依賴,就能自動獲得所需的功能,無需手動配置

本文將基于 Spring Boot 的自動化裝配原理,手把手教你如何制作自己的 Spring Boot Starter 依賴

1. Spring Boot Starter 的本質

Spring Boot Starter 的本質是一個依賴聚合器自動化配置提供者

  • 依賴聚合: 一個 Starter 通常會引入實現某個功能所需的所有其他依賴例如,spring-boot-starter-web 會引入 Spring MVC、Tomcat 等依賴
  • 自動化配置: Starter 中包含了自動化配置類,這些類會根據當前項目的環境(依賴、配置等)自動配置相關的 Bean,使得用戶無需手動編寫繁瑣的配置

制作自己的 Starter,就是將你的通用功能封裝在一個或多個模塊中,并按照 Spring Boot 的規范提供自動化配置


2. Starter 的模塊結構(推薦)

為了清晰起見,通常會將一個 Starter 分為兩個模塊:

  • xxx-spring-boot-starter: 這是提供給用戶引入的模塊它本身不包含實際的代碼,只作為依賴的入口,主要依賴于 xxx-spring-boot-autoconfigure 模塊
  • xxx-spring-boot-autoconfigure: 這是包含實際自動化配置邏輯的模塊你所有的配置類、條件注解、以及 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件都放在這個模塊中

這種分離的好處是:

  • 職責分離: Starter 模塊只負責依賴管理,autoconfigure 模塊負責自動化配置邏輯
  • 清晰: 用戶引入 Starter 模塊即可,無需關心內部實現

當然,對于簡單的 Starter,你也可以將所有內容放在一個模塊中,但這不符合最佳實踐


3. 制作 xxx-spring-boot-autoconfigure 模塊

這是實現自動化配置的核心模塊

3.1 添加必要的依賴

首先,在 xxx-spring-boot-autoconfigure 模塊的 pom.xml (Maven) 或 build.gradle (Gradle) 中添加 Spring Boot 的自動化配置依賴:

Maven:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- 如果你的自動化配置依賴于某個第三方庫,也需要在這里添加 -->
<!-- <dependency><groupId>com.example</groupId><artifactId>some-library</artifactId>
</dependency> -->

Gradle:

implementation 'org.springframework.boot:spring-boot-autoconfigure'
// 如果你的自動化配置依賴于某個第三方庫,也需要在這里添加
// implementation 'com.example:some-library'

spring-boot-autoconfigure 模塊包含了 @ConditionalOn... 等條件注解,以及 Spring Boot 自動化配置所需的基礎設施

3.2 編寫具體功能的配置類

創建包含你通用功能具體 Bean 定義的配置類這些類通常使用 @Configuration@Bean 注解

// src/main/java/com/example/starter/autoconfigure/MyServiceConfig.java
@Configuration
public class MyServiceConfig {// 定義一個通用的服務 Bean@Beanpublic MyService myService() {return new MyService();}// 如果你的服務需要配置屬性,可以使用 @ConfigurationProperties@Bean@ConfigurationProperties(prefix = "my.service")public MyServiceProperties myServiceProperties() {return new MyServiceProperties();}
}

3.3 編寫自動化配置類 (@AutoConfiguration)

創建標記為 @AutoConfiguration 的自動化配置類這個類將作為自動化配置的入口,并使用相應的條件注解來控制何時生效

// src/main/java/com/example/starter/autoconfigure/MyServiceAutoConfiguration.java
@AutoConfiguration // 標記為自動化配置類 (Spring Boot 2.7+)
// @Configuration // 兼容早期版本,但推薦使用 @AutoConfiguration
@ConditionalOnClass(MyService.class) // 條件:只有當 MyService.class 存在時才生效
@EnableConfigurationProperties(MyServiceProperties.class) // 啟用配置屬性綁定
@Import(MyServiceConfig.class) // 導入包含具體 Bean 定義的配置類
public class MyServiceAutoConfiguration {// 這個類本身可以不定義 Bean,主要通過 @Import 導入其他配置類// 也可以在這里直接定義 Bean,并使用條件注解// @Bean// @ConditionalOnMissingBean // 如果沒有 MyService 的 Bean,則創建默認的// public MyService defaultMyService() {//     return new MyService();// }
}

重要提示:

  • 使用 @AutoConfiguration 注解(Spring Boot 2.7+)
  • 使用 @ConditionalOnClass 等條件注解來控制自動化配置的生效條件通常會判斷某個核心類是否存在,或者某個配置屬性是否設置
  • 使用 @Import 注解導入包含具體 Bean 定義的配置類
  • 如果你的功能需要配置屬性,使用 @EnableConfigurationProperties@ConfigurationProperties 來綁定屬性

3.4 注冊自動化配置類 (.importsspring.factories)

這是最關鍵的一步,讓 Spring Boot 能夠找到你的自動化配置類

推薦方式 (Spring Boot 2.7+):

xxx-spring-boot-autoconfigure 模塊的 src/main/resources/META-INF/spring/ 目錄下創建 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件

在該文件中,每行填寫一個你的自動化配置類的全限定名

# src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.starter.autoconfigure.MyServiceAutoConfiguration

兼容早期版本方式:

xxx-spring-boot-autoconfigure 模塊的 src/main/resources/META-INF/ 目錄下創建 spring.factories 文件

在該文件中,添加如下內容:

# src/main/resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.autoconfigure.MyServiceAutoConfiguration

在 Spring Boot 2.7+ 中,你可以同時使用這兩種方式,但推薦優先使用 .imports 文件


4. 制作 xxx-spring-boot-starter 模塊

這個模塊非常簡單,它的主要作用就是依賴 xxx-spring-boot-autoconfigure 模塊,并遵循 Starter 的命名規范

xxx-spring-boot-starter 模塊的 pom.xml (Maven) 或 build.gradle (Gradle) 中添加依賴:

Maven:

<dependency><groupId>com.example</groupId><artifactId>my-service-spring-boot-autoconfigure</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>

Gradle:

implementation 'com.example:my-service-spring-boot-autoconfigure:1.0.0-SNAPSHOT'

這個模塊通常不需要編寫任何 Java 代碼


5. 使用你的 Starter 依賴

現在,其他 Spring Boot 項目只需要在 pom.xmlbuild.gradle 中引入你的 Starter 依賴即可:

Maven:

<dependency><groupId>com.example</groupId><artifactId>my-service-spring-boot-starter</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>

Gradle:

implementation 'com.example:my-service-spring-boot-starter:1.0.0-SNAPSHOT'

當用戶引入這個依賴后,你的 xxx-spring-boot-autoconfigure 模塊就會被添加到項目的運行時類路徑中。Spring Boot 啟動時,AutoConfigurationImportSelector 會找到并加載 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(或 spring.factories),發現并處理你的 MyServiceAutoConfiguration如果條件滿足,MyServiceAutoConfiguration 中導入的 MyServiceConfig 生效,MyService Bean 就會被自動創建并注冊到 Spring 容器中

用戶可以直接在他們的代碼中注入并使用 MyService

@Service
public class SomeBusinessLogic {@Autowiredprivate MyService myService; // 直接注入,無需手動配置// ... 使用 myService
}

6. 最佳實踐和注意事項

  • 命名規范: 遵循 Spring Boot Starter 的命名規范 xxx-spring-boot-starter
  • 版本管理: 合理管理你的 Starter 版本
  • 文檔: 為你的 Starter 提供清晰的文檔,說明它的功能、如何使用、支持哪些配置屬性等
  • 條件注解: 充分利用條件注解,確保你的自動化配置只在需要時生效,避免不必要的 Bean 創建和沖突
  • 配置屬性: 如果你的功能需要用戶進行配置,使用 @ConfigurationProperties 提供類型安全的配置
  • 日志: 在自動化配置類中使用日志,方便用戶排查問題
  • 測試: 編寫自動化測試來驗證你的 Starter 是否按預期工作

總結

制作自己的 Spring Boot Starter 依賴,是提升代碼復用性和開發效率的有效手段通過理解 Spring Boot 的自動化裝配原理,特別是 META-INF/spring.factories.imports 文件以及條件注解的作用,你就能輕松地將你的通用功能封裝成易于使用的 Starter,讓其他項目能夠享受到自動化裝配帶來的便利

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

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

相關文章

Qt6之qml自定義控件開發流程指南

Qt6之qml自定義控件開發流程指南 &#x1f6e0;? 一、基礎控件創建 定義 QML 文件 在工程中新建 QML 文件&#xff08;如 CustomButton.qml&#xff09;&#xff0c;文件名首字母大寫。 使用基礎組件&#xff08;如 Rectangle、Text&#xff09;構建控件邏輯&#xff0c;通過…

Vue簡介,什么是Vue(Vue3)?

什么是Vue&#xff1f; Vue是一款用于構建用戶界面的JavaScript框架。 它基于標準HTML、CSS和JavaScript構建&#xff0c;并提供了一套聲明式的、組件化的編程模型&#xff0c;幫助你高效地開發用戶界面。無論是簡單的還是復雜地界面&#xff0c;Vue都可以勝任。 聲明式渲染…

從零開始構建Airbyte數據管道:PostgreSQL到BigQuery實戰指南

作為數據工程師&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;流程是日常工作的核心。然而&#xff0c;構建和維護數據管道往往耗時且復雜。幸運的是&#xff0c;開源工具Airbyte提供了一種更便捷的解決方案——它支持350預構建連接器&#xff0c;允許通過無…

JavaScript的初步學習

目錄 JavaScript簡介 主要特點 主要用途 JavaScript的基本特性 JavaScript的引入方式 1. 內聯方式 (Inline JavaScript) 2. 內部方式 (Internal JavaScript / Embedded JavaScript) 3. 外部方式 (External JavaScript) JavaScript的語法介紹 1.書寫語法 2.輸出語句 3.…

洛谷P1379 八數碼難題【A-star】

P1379 八數碼難題 八數碼難題首先要進行有解性判定&#xff0c;避免無解情況下盲目搜索浪費時間。 有解性判定 P10454 奇數碼問題 題意簡述 在一個 n n n \times n nn 的網格中進行&#xff0c;其中 n n n 為奇數&#xff0c; 1 1 1 個空格和 [ 1 , n 2 ? 1 ] [1,n^2…

MySQL Buffer Pool 深度解析:從架構設計到性能優化(附詳細結構圖解)

在 MySQL 數據庫的世界里&#xff0c;有一個決定性能上限的"神秘倉庫"——Buffer Pool。它就像超市的貨架&#xff0c;把最常用的商品&#xff08;數據&#xff09;放在最方便拿取的地方&#xff0c;避免每次都要去倉庫&#xff08;磁盤&#xff09;取貨。今天我們就…

使用numpy的快速傅里葉變換的一些問題

離散傅里葉變換&#xff08;DFT&#xff09;的頻率&#xff08;或波數&#xff09;確實主要由采樣點數和物理步長決定。 最高波數和最小波長的乘積是1。單位長度內波的周期數。 &#xff08;注意角波數是 k 2 π λ k \frac{2 \pi}{\lambda} kλ2π?&#xff09; 使用numpy…

DVWA靶場通關筆記-CSRF(High級別)

目錄 一、CSRF Token 二、代碼審計&#xff08;High級別&#xff09; 1、滲透準備 2、源碼分析 三、滲透實戰 1、滲透準備 2、修改URL重放失敗 3、burpsuite嘗試重放失敗 4、安裝CSRF Token Tracker 5、安裝logger插件 6、配置CSRF Token Tracker 7、bp再次重放報文…

Redis實戰:數據安全與性能保障

數據安全 持久化策略 RDB持久化&#xff1a;通過創建快照將內存中的數據寫入到磁盤上的RDB文件中。可以在配置文件中設置save參數來指定在多少秒內有多少次寫操作時觸發快照保存。例如&#xff0c;save 900 1表示900秒內至少有1次寫操作時保存快照。 AOF持久化&#xff1a;將每…

人臉活體識別3:C/C++實現實時眨眼、張嘴、點頭、搖頭檢測

> 當AI能識破照片與真人的區別,我們才真正跨入生物識別安全時代 --- ### 一、活體檢測:數字世界的守門人 **傳統人臉識別的致命缺陷**: - 高清照片欺騙成功率 > 85% - 視頻回放攻擊成本 < $50 - 3D面具破解率高達72% **我們的解決方案**: ```mermaid graph …

【Linux】AlmaLinux 無法使用root用戶登錄cockpit控制臺問題解決

在虛擬機安裝AlmaLinux 9.6&#xff0c;安裝過程中需要允許使用root用戶和SSH協議登錄服務器。但是&#xff0c;在使用root用戶登錄cockpit管理后臺時&#xff0c;系統提示“權限被拒絕”。 經過查詢資料&#xff0c;可以通過下面的方法來解決此問題。 編輯 /etc/cockpit/disa…

【Java面試】講講HashMap的常用方法,以及底層實現?

1. 底層數據結構 數組鏈表紅黑樹&#xff08;JDK 1.8&#xff09;&#xff1a; 數組&#xff08;Node[] table&#xff09;存儲桶&#xff08;bucket&#xff09;&#xff0c;每個桶是鏈表或紅黑樹的頭節點。鏈表解決哈希沖突&#xff0c;當鏈表長度 ≥ 8 且數組容量 ≥ 64 時…

ToT:思維樹:借助大語言模型進行審慎的問題求解

摘要 語言模型正日益被部署于廣泛任務中的通用問題求解&#xff0c;但在推理階段仍受限于 token 級、從左到右的決策過程。這意味著在需要探索、戰略前瞻&#xff0c;或初始決策起關鍵作用的任務中&#xff0c;語言模型可能表現不佳。為克服這些挑戰&#xff0c;我們提出了一種…

Web3 + RWA 餐飲數字化解決方案白皮書(試點版)

一、背景&#xff1a;從“用戶”到“共創股東”&#xff0c;重構本地生活新邏輯 ? 項目愿景&#xff1a; “用一頓飯&#xff0c;鏈接一個社群&#xff1b;用一次消費&#xff0c;綁定一份權益”。 傳統商業以“交易”為中心&#xff0c;未來商業則以“關系 價值流轉”為核…

MCU的模擬輸入ADC引腳如何實現采樣時間與阻抗匹配

在MCU的模擬輸入ADC引腳中&#xff0c;實現采樣時間與阻抗匹配是關鍵的設計環節&#xff0c;直接影響采樣精度。以下是分步說明&#xff1a; 【】理解信號源阻抗與采樣時間的關系 ? 信號源阻抗&#xff08;Rs&#xff09;&#xff1a;外部信號源的輸出阻抗&#xff08;如傳感器…

等價矩陣 線性代數

所謂等價矩陣&#xff0c;就是說其秩相同的矩陣。 例題 A和B等價就是求A和B的秩&#xff0c;其實就是要求B的秩了&#xff0c;因為目標已經告訴你了A和B的秩是一樣的。那么怎么求B的秩呢&#xff1f;我們現在只有一種方法求其秩&#xff0c;就是通過把其經過初等變換之后符合標…

30.設計模式的優缺點

原文地址:設計模式的優缺點 更多內容請關注&#xff1a;智想天開 一、設計模式的優點 1. 提高代碼復用性與可維護性 復用性&#xff1a; 設計模式提供的是抽象的解決方案&#xff0c;可以在多個項目中重復應用&#xff0c;避免重復造輪子。例如&#xff0c;工廠模式封裝了對象…

Python 爬蟲實戰 | 國家醫保

一、國家醫保 1、目標網站 網址&#xff1a;https://fuwu.nhsa.gov.cn/nationalHallSt/#/search/drug-directory目標數據&#xff1a;獲取藥品信息 2、網站特點 服務端返回加密數據&#xff0c;客戶端發送請求攜帶的載荷也是加密的 3、定位解密入口 可以通過關鍵字encDa…

OpenCV CUDA模塊設備層----計算向量的平方根函數sqrt

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的 CUDA 設備函數&#xff08;device function&#xff09;&#xff0c;用于在 GPU 上計算一個 uchar4 類型向量的平方根&#xff0c;并返…

鴻蒙應用開發:HTTP訪問網絡

一、HTTP概述 在許多場景下&#xff0c;我們的應用需要從服務端獲取數據&#xff0c;例如&#xff0c;天氣應用需要從天氣服務器獲取天氣數據。新聞應用需要從新聞服務器獲取最新的新聞咨詢&#xff0c;通過HTTP數據請求&#xff0c;我們可以將互聯網上的信息展示在應用中&…