SPI機制:為某個接口尋找服務(wù)實現(xiàn)的機制
java SPI就是提供這樣的一個機制 ,需要在META-INF目錄中設(shè)置接口的實現(xiàn),以實現(xiàn)服務(wù)接口與實現(xiàn)的解耦辉饱。第三方服務(wù)廠商或者插件服務(wù)懈贺,可以依據(jù)SPI機制经窖,實現(xiàn)功能擴展。
在Spring中也有一種類似與Java SPI的加載機制梭灿。它在META-INF/spring.factories文件中配置接口的實現(xiàn)類画侣,我們成為Spring factories機制,基于此我們可以自定義stater或SDK供他人使用堡妒,項目只在pom.xml中引入SDK,無須配置即可實現(xiàn)功能集成配乱。
最近的需求為例,需要實現(xiàn)授權(quán)功能SDK,以供其他產(chǎn)品使用
項目目錄結(jié)構(gòu)如下
第一步:在包名root目錄下創(chuàng)建自動配置類?EsbrSdkAutoConfig
內(nèi)容如下:添加
@Configuration
@ComponentScan(basePackageClasses = EsbrSdkAutoConfig.class)
標(biāo)識此類為配置類皮迟,并配置掃描路徑為當(dāng)前類
第二步;? ? 在resources/META-IN目錄下搬泥,創(chuàng)建spring.factories文件
內(nèi)容如下:
將org.springframework.boot.autoconfigure.EnableAutoConfiguration的自動配置為值設(shè)置為第一步的EsbrSdkAutoConfig的全限定類名(包名+類名)
第三步:編寫SDK的Service
通過以上三步,即可基于Spring factories機制完成自定義Starter,在其他項目pom.xml中引入該starter即可
是不是很簡單伏尼,下面講解下原理
spring-core包里定義了SpringFactoriesLoader類忿檩,這個類實現(xiàn)了檢索META-INF/spring.factories文件中的配置,
并通過loadFactoryNames方法()獲取其接口類的名稱
在這個方法中會遍歷整個ClassLoader中所有jar包下的spring.factories文件爆阶。也就是說我們可以在自己的jar中配置spring.factories文件燥透,不會影響到其它地方的配置,也不會被別人的配置覆蓋辨图。
將org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.org.bjca.esbr.sdk.EsbrSdkAutoConfig
基于springboot自動配置班套,會掃描并初始化EsbrSdkAutoConfig類,并將EsbrSdkAutoConfig作為basepackage,掃描改類及其該類子包下的類徒役,加載到spring容器孽尽。