翻譯一下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 使用ConditionalOnClass和ConditionalOnMissingBean注解,這兩注解的確保只有當(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
ConditionalOnBean和ConditionalOnMissingBean注解允許用于或確實指定的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)境屬性進行配置,使用prefix和name參數(shù)來檢查指定的屬性值,任何存在且不等于屬性false都將被匹配,更高級的檢查可以使用havingValue和matchIfMissing屬性。
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-autoconfigure和acme-spring-boot-starter,
final
starter其實是一個空的模塊,它的唯一目的其實就是提供一個必要的依賴關(guān)系,