理解Spring Boot中的auto-configuration

翻譯一下Spring官網(wǎng)的文章,加深自己對Spring Boot自動裝配的一些理解。

不管你是開發(fā)開源軟件或者商業(yè)軟件,當(dāng)你在開發(fā)一個共享庫的時候,那么可能你需要使用自動配置,自動配置可以捆綁在外部的jar包中,由Spring Boot提取。
快速學(xué)習(xí)的mode代碼:示例項目

下面將介紹自動配置的一些知識:

1.了解自動配置的bean

查看(脫掉)Spring的代碼(衣服),auto-configuration 就是一個實現(xiàn)了Configuration接口的類。使用@Conditional注解來限制何時讓auto-configuration 生效,通常auto-configuration 使用ConditionalOnClassConditionalOnMissingBean注解,這兩注解的確保只有當(dāng)我們擁有相關(guān)類的時候使得@Configuration注解生效。

2.auto-configuration的目錄結(jié)構(gòu)

Spring Boot 會檢查所有jar包下的META-INF/spring.factories文件,這個文件中EnableAutoConfiguration 的KEY下面羅列了需要自動配置的類,例如:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration

當(dāng)我們需要對配置類的加載順序排序的時候,可以使用
@AutoConfigureAfter或者@AutoCOnfigureBefore注解。
例如,如果我們提供了一個特殊的web configuration,需要在WebMvcAutoConfiguration之后才對我們注解的類進行加載。
如果想要自動排序,可以使用@AutoconfigureOrder注解,這個注解類似于@Order,但是它是專門給auto-configuration使用。

Auto-configuration 只有通過這種方式加載,確保 他們定義在一個特定的包空間下能夠被掃描。

3.Condition注解

我們在auto-configuration中看到不止一個使用了@Condition注解的類,比如 @ConditionalOnMissingBean,那么下面就介紹一下auto-configuration中常用的注解

Class Conditions

@ConditionalOnClass@ConditionalOnMissingClass 注解允許擁有或缺失指定的類進行配置,另外使用了ASM技術(shù) 來解析注解,我們可以使用value屬性來引用出真實的類,即使這個類不會出現(xiàn)在正在運行的程序類路徑中,如果希望指定類名,可以使用name屬性

bean Conditions

ConditionalOnBeanConditionalOnMissingBean注解允許用于或確實指定的bean來進行配置,我們可以使用value屬性配置一個特別的類型?;蛘哂胣ame配置特殊的名字,search屬性允許限制搜索ApplicationContext中的層次結(jié)構(gòu)。

@Configuration
 public  class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService(){...}
}

在這個方法中,myService如果還沒有存在Spring容器中,那么它將會在這個方法中得到創(chuàng)建。

這里特別需要注意bean的啟動順序,因為在做一個共享庫的時候影響十分深遠(yuǎn),所以,我們應(yīng)當(dāng)盡量使用@ConditionalOnBean@ConditionalOnMissingBena注解在auto-configuration的過程中。保證用戶在添加了自已定義的bean后能夠正常的加載系統(tǒng)。

@ConditionalOnBean@ConditionalOnMissingBean不會阻止被@Configuration注解的類加載,所以這些條件應(yīng)當(dāng)去標(biāo)記具體包含的每個方法

Property Condition

@ConditionalOnProperty注解允許基于Spring的環(huán)境屬性進行配置,使用prefixname參數(shù)來檢查指定的屬性值,任何存在且不等于屬性false都將被匹配,更高級的檢查可以使用havingValuematchIfMissing屬性。

Resource Condition

@ConditionalOnResource注解去判斷指定的資源是否存在,可以使用常規(guī)的Spring約束來指定資源,例如file://home/usr/test.dat。

Web Application Condition

@ConditionalOnWebApplication@ConditionalOnNotWebApplication注解允許根據(jù)應(yīng)用是否是一個“web應(yīng)用程序”被包括配置。

SPEL表達式

@ConditionalOnExpression注釋允許基于一個的結(jié)果被包括配置使用SpEL表達

創(chuàng)建自定義的starter

一個完整的Spring Boot starter應(yīng)該包含下面這些組件:

  • autoconfigure 模塊包含了自動配置的代碼
  • starter模塊提供了一個autoconfigure的模塊和其他額外的依賴。

命名的問題

需要確保為我們的starter提供了一個合適名字,不要讓模塊名字叫spring-boot等一系列不知所云的名稱,即使你用的不同的Maven GroupId,我們應(yīng)當(dāng)讓模塊名稱更規(guī)范,容易理解。

例如我們正在創(chuàng)建一個acme的start模塊,命名推薦叫做acme-spring-boot-autoconfigureacme-spring-boot-starter,

final

starter其實是一個空的模塊,它的唯一目的其實就是提供一個必要的依賴關(guān)系,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容