1. 程式人生 > >如何開發自己的Spring Boot Starter

如何開發自己的Spring Boot Starter

我們在使用 Spring Boot 的過程中,往往都是在pom.xml里加了一系列的依賴,然後啟支一個包含main方法的Application,一切就OK啦。給你我的感覺,就像是自己要動手做個菜,自己不再需要準備每一部分的原材料,直接購買包裝好的一份菜的原料,下鍋即可

那我們詳細看下,這份「包裝好」的原料中,到底做了些什麼。

新增Starter依賴

這裡新增的依賴,除了我們之前在Maven中熟悉的之外,還有一些都是長這個樣子:

名為xxx-starter,比如

 

具體這些starter是怎麼起作用的呢,他們什麼時候開始工作的?

一切都要從入口處說起。我們以上面的starter為例,看到這個mybatis的starter,其對應的pom中,包含這些依賴

 

我們看到,相當於我們添加了一個Starter的依賴,其背後會引入許多其定義的其他依賴,通過 Maven 的傳遞依賴,這些都會被自動添加了進來。

自動配置

相比傳統的依賴,我們看到其中包含這樣一個:mybatis-spring-boot-autoconfigure,這也是每個Starter的祕密所在:「AutoConfigure」

它會在實現時,考慮應用中的其他部分因素,「推斷」你所需要的 Spring 配置。

 

在Spring Boot中,我們最大的感受是配置彷彿都被做好了,直接使用即可,這就是

spring-boot-autoconfigure.   每個starter都有一個名為spring.factories

的檔案,存放在META-INF目錄下,其中的內容類似下面這個樣子:

 

所有需要自動配置的Class,都需要配置成key是EnableAutoConfiguration的。

我們來看類的內部

 

Class 之上, 有不少註解來標識,有幾點需要關注的:

其中有標準的 Spring 配置註解 @Configuration

幾個@ConditionalXX

標識執行順序的@AutoConfigureAfter

其中,@ConditionalOnClass 標識 SqlSessionFactory類存在時,執行該配置, @ConditionalOnBean標識DataSource Bean

在 Spring Context時,執行配置。

這些spring.factories是怎麼被識別的呢? 這就得誇下 Spring 的FactoriesLoader了。

看下官方文件說明

啟動的時候,根據ClassLoader中的jar,掃描所有 spring.factories,將其中符合條件的過濾出來,執行對應的配置。重點可以關注下

AutoConfigurationImportFilter類,

經過這裡的執行之後, filter方法把符合條件的過濾出來了。

建立自定義Starter

經過上面兩步,我們大概知道 Starter的工作原理。有時候,我們需要對外提供一些工具元件時,也想以 Starter 的形式提供出來,供別人使用。步驟也還算清晰,照葫蘆畫瓢。

先建立自己的模組

增加需要用到的依賴

建立對應的 AutoConfiguration類

建立META-INF/spring.factories 檔案

此時,就不需要再將 Spring Boot 做為 Parent依賴,在單獨的依賴中增加

 

AutoConfiguration類也簡單,照上面的建立一個

 

然後,增加檔案

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.HelloServiceAutoConfiguration

在需要這個服務的地方,直接引入依賴就OK啦。

歡迎工作一到五年的Java工程師朋友們加入Java填坑之路:860113481

群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!