文章目錄
starter的demo
一、什麼時候需要starter
打當你開發一個需要被人使用的lib,或者使用商業的lib時,你可以做一個自動裝配的starter,可以被spring boot 自動設置
二、理解Auto-configured bean
首先auto-configuration
是一個 @Configuration的實現。同時額外的加上了
@Conditional
註解。
通常auto-configuration
類使用@ConditionalOnClass
和@ConditionalOnMissingBean
註解以便於判斷是否符合自動裝配的條件。----其依賴的類或者配置是否存在
三、spring boot如何找到starter
在你starter的jar包的目錄下META-INF/spring.factories
,是配置有哪些自動配置類
自動配置的類,只能以這種方式來定位。來確保他們在一個特殊的路徑下,不被component scan自動掃描到。更重要的是auto-configuration類不應該打開組件掃面(componment scan)而是應該使用
@Import
你可以使用@AutoConfigureAfter
或 @AutoConfigureBefore
來配置順序,你也可以定義@AutoConfigureOrder
來定義順序。
四、條件註解
重要的特性,提供高級的規則來判斷一個bean是否應該被裝配。
我們有多種@Conditional
註解,
@ConditionalOnMissingBean
最常用。
proxyBeanMethods =flase
是5.2的新特性,讓配置類不會被代理提高性能
具體看原文的使用方式
五、自動配置的測試
stater具體加載那些類是不確定的,是根據設置的條件生成的。所以有必要去設置測試,來檢測是否成功配置。每種測試例子都需要自己的applicationContext
,
ApplicationContextRunner
可以辦到。
ApplicationContextRunner
總是被當做filed被引入,如下可以生成一個applicationContext
包含uservices自動配置
具體配置見原文
模擬 a Web Context
需要servlet操作的,可以有WebApplicationContextRunner
和ReactiveWebApplicationContextRunner
Overriding the Classpath
有時候你要測試當類不存在時,會發生什麼,spring boot 提供ships
方式給包改名字,達到包miss的效果。
六、創建你自己的starter
spring boot stater包含下面兩個組件
- autoconfigure module 包含auto-configuration 代碼
- starter模塊依賴autoconfigure模塊,也暴露給外界(額外的依賴)像一個堅果殼,提供啓動所需的所有依賴。
naming
命名,不要以spring-boot開頭。
比如你的starter叫acme
,可以這麼命名模塊acme-spring-boot-autoconfigure
和acme-spring-boot-starter
。
Configuration keys
配置鍵值對
配置建議
- 變量的描述不要以
the
或者a
開頭 boolean
類型,請以Whether
或Enable
開頭- 數組類型,請以
,
分割的元素 - 使用java.time.Duration要比long來描述時間好的多,當沒有單位時默認是秒
autoconfigure Module
這個模塊包含了,啓動時必須要要實例化的依賴。可能會包含上述Configuration keys
的定義,比如@ConfigurationProperties
;和初始化用的callback函數。
你應該去標識你的依賴爲可選的,暴露給springboot來選擇是否是關閉這些依賴
Spring Boot使用註解驅動的 processor,來收集自動配置條件(可以配置在文件裏META-INF/spring-autoconfigure-metadata.properties
),如果有這個文件,就會被用來過濾不需要配置的類,來節約啓動時間。
推薦在autoconfigure
加入如下的配置。
Starter Module
這個模塊真的就知識一個空模塊而已,只是爲了提供一個必要的依賴而已。你可以把它想成一個view而已。
不要假定的stater需要的一些條件被加載了。典型的你的stater可能需要其他starter,也要留意他們。同時提供一個默認的依賴是困難的,尤其是提供了大量可選的條件,你應該避免把必須要用的依賴設爲可選,換句話說你把常用的依賴,不要設爲可選。
有兩種使用方式,你的starter必須直接引用
spring-boot-starter
;你的stater依賴其他strter,簡介的依賴了spring-boot-starter
具體還得看demo