查看: 593|回復: 0

如何開發自己的Spring Boot Starter

發表于 2018-10-30 16:04:02
我們在使用 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等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!



回復

使用道具 舉報