??Spring Boot SPI 用法教程?
???一 概念與版本差異??
- ??SPI(Service Provider Interface)??是一種在運行時發(fā)現(xiàn)并加載服務(wù)實現(xiàn)的機(jī)制,核心是“??接口與實現(xiàn)分離??”。在 ??JDK?? 中通過 ??META-INF/services/接口全限定名?? 文件與 ??ServiceLoader?? 實現(xiàn);在 ??Spring Boot?? 中擴(kuò)展了該思想,使用 ??META-INF/spring.factories?? 與 ??SpringFactoriesLoader?? 來批量加載自動配置、監(jiān)聽器等擴(kuò)展點。自 ??Spring Boot 2.7?? 起,官方為自動配置新增了 ??META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports?? 文件以替代 spring.factories 的自動配置注冊方式,二者可并存(老項目仍可用 spring.factories)。Spring 的 SPI 加載機(jī)制與 IoC 容器深度集成,支持按條件加載與更靈活的實例化策略。
??二 兩種 SPI 用法速覽??
- 原生 Java SPI
- 約定路徑:??META-INF/services/接口全限定名??;內(nèi)容為每行一個??實現(xiàn)類全限定名??。
- 加載方式:??ServiceLoader.load(接口.class)??,迭代器按需實例化實現(xiàn)類(延遲加載、默認(rèn)無參構(gòu)造)。
- 適用:與容器無關(guān)、輕量插件發(fā)現(xiàn)。
- Spring Boot SPI
- 約定路徑與方式:
- 自動配置:Spring Boot 2.7+ 使用 ??META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports??(每行一個自動配置類);2.7 之前使用 ??META-INF/spring.factories?? 的 ??org.springframework.boot.autoconfigure.EnableAutoConfiguration?? 鍵。
- 其他擴(kuò)展點:在 ??META-INF/spring.factories?? 中以鍵值對注冊(如 ??ApplicationListener??、自定義擴(kuò)展接口)。
- 加載方式:??SpringFactoriesLoader.loadFactories/loadFactoryNames?? 讀取并實例化,可與 Spring 條件注解、環(huán)境集成。
??三 實戰(zhàn)一 自定義 Starter 并啟用自動配置(Spring Boot 2.7+)??
步驟
- 新建模塊(如 ??my-spi-starter??),無需啟動類;添加依賴:
- ??spring-boot-autoconfigure??
- (可選)??spring-boot-configuration-processor??(生成配置元數(shù)據(jù))
- 定義業(yè)務(wù)接口與實現(xiàn):
- 接口:??com.example.spi.GreetingService??
- 實現(xiàn):??com.example.spi.impl.EnglishGreetingService??、??ChineseGreetingService??
- 編寫自動配置類:
- 路徑:??com.example.spi.config.GreetingAutoConfiguration??
- 要點:使用 ??@Configuration??、條件注解(如 ??@ConditionalOnClass??)、以及 ??@ConditionalOnMissingBean?? 保證用戶可覆蓋默認(rèn) Bean。
- 注冊自動配置:在 ??resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports?? 寫入自動配置類全限定名(每行一個)。
- 使用:在業(yè)務(wù)項目中引入 starter 依賴,按類型注入 ??GreetingService?? 即可使用(若用戶自行定義了同類型 Bean,則以用戶 Bean 為準(zhǔn))。
關(guān)鍵文件示例
AutoConfiguration.imports
com.example.spi.config.GreetingAutoConfiguration
GreetingAutoConfiguration.java
@Configuration
@ConditionalOnClass(GreetingService.class)
public class GreetingAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public GreetingService greetingService() {
// 可按條件選擇默認(rèn)實現(xiàn),或返回抽象工廠
return new EnglishGreetingService();
}
}說明
若需兼容 ??Spring Boot <2.7??,可在同模塊 ??resources/META-INF/spring.factories?? 增加:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.spi.config.GreetingAutoConfiguration
條件注解(如 ??@ConditionalOnClass/@ConditionalOnMissingBean??)是編寫自動配置的最佳實踐,可避免沖突并提升可覆蓋性。
??四 實戰(zhàn)二 使用 Java SPI 插件機(jī)制??
步驟
定義插件接口:??com.example.spi.Plugin??
多個實現(xiàn):??com.example.spi.impl.PluginA??、??PluginB??
注冊插件:在 ??resources/META-INF/services/com.example.spi.Plugin?? 寫入實現(xiàn)類全限定名(每行一個)。
加載插件(可在任意 Spring Bean 中):
import java.util.ServiceLoader;
ServiceLoader<Plugin> loader = ServiceLoader.load(Plugin.class);
for (Plugin p : loader) {
p.execute();
}適用場景
與 Spring 容器解耦的純發(fā)現(xiàn)機(jī)制;若需要依賴注入、AOP、條件控制,優(yōu)先考慮 Spring Boot 的 ??SpringFactoriesLoader?? 或在自動配置中封裝 [ServiceLoader]。
??五 常見問題與最佳實踐??
版本與路徑
??Spring Boot 2.7+?? 推薦將自動配置寫入 ??META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports??;老項目或第三方庫仍可能使用 ??META-INF/spring.factories??,注意維護(hù)兼容性。
條件裝配
在自動配置類上使用 ??@ConditionalOnClass/@ConditionalOnMissingBean?? 等,明確生效條件與可覆蓋性,避免與用戶配置沖突。
避免類路徑?jīng)_突
明確依賴版本與導(dǎo)出包,防止不同 JAR 提供同名實現(xiàn)導(dǎo)致不可預(yù)期行為。
擴(kuò)展點選擇
啟動生命周期、環(huán)境處理等框架擴(kuò)展點可用 ??spring.factories?? 注冊(如 ??SpringApplicationRunListener??、??EnvironmentPostProcessor??);業(yè)務(wù)插件發(fā)現(xiàn)可用 ??Java SPI?? 或 ??SpringFactoriesLoader??。
可維護(hù)性與文檔
為自定義 ??Starter?? 提供清晰的 ??README??、配置示例與可覆蓋策略說明,便于團(tuán)隊接入與二次開發(fā)。
到此這篇關(guān)于??Spring Boot SPI 用法教程?的文章就介紹到這了,更多相關(guān)??Spring Boot SPI內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBootWeb?入門了解?Swagger?的具體使用
這篇文章主要介紹了SpringBootWeb?入門了解?Swagger?的具體使用,Swagger?框架可以根據(jù)已經(jīng)實現(xiàn)的方法或者類,通過頁面的方式直觀清晰的查看或者進(jìn)行測試該方法,需要的朋友可以參考下2024-08-08
Java中CopyOnWriteArrayList的使用解析
這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫操作的場景里,比如緩存,它不存在擴(kuò)容的概念,每次寫操作都要復(fù)制一個副本,在副本的基礎(chǔ)上修改后改變Array引用,需要的朋友可以參考下2023-12-12
java中的構(gòu)造函數(shù)什么時候被調(diào)用執(zhí)行
這篇文章主要介紹了java中的構(gòu)造函數(shù)什么時候被調(diào)用執(zhí)行問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
Java日常練習(xí)題,每天進(jìn)步一點點(22)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07
Springboot單體架構(gòu)http請求轉(zhuǎn)換https請求來支持微信小程序調(diào)用接口
這篇文章主要介紹了Springboot單體架構(gòu)http請求轉(zhuǎn)換https請求來支持微信小程序調(diào)用接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

