翻譯一下Spring官網(wǎng)的文章敬鬓,加深自己對Spring Boot自動裝配的一些理解匹颤。
不管你是開發(fā)開源軟件或者商業(yè)軟件关摇,當(dāng)你在開發(fā)一個共享庫的時候杖小,那么可能你需要使用自動配置肆汹,自動配置可以捆綁在外部的jar包中,由Spring Boot提取予权。
快速學(xué)習(xí)的mode代碼:示例項(xiàng)目
下面將介紹自動配置的一些知識:
1.了解自動配置的bean
查看(脫掉)Spring的代碼(衣服),auto-configuration 就是一個實(shí)現(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
之后才對我們注解的類進(jìn)行加載迫吐。
如果想要自動排序,可以使用@AutoconfigureOrder
注解账忘,這個注解類似于@Order
志膀,但是它是專門給auto-configuration使用熙宇。
Auto-configuration 只有通過這種方式加載,確保 他們定義在一個特定的包空間下能夠被掃描溉浙。
3.Condition注解
我們在auto-configuration中看到不止一個使用了@Condition
注解的類烫止,比如 @ConditionalOnMissingBean
,那么下面就介紹一下auto-configuration中常用的注解
Class Conditions
@ConditionalOnClass
和@ConditionalOnMissingClass
注解允許擁有或缺失指定的類進(jìn)行配置戳稽,另外使用了ASM技術(shù) 來解析注解馆蠕,我們可以使用value屬性來引用出真實(shí)的類,即使這個類不會出現(xiàn)在正在運(yùn)行的程序類路徑中惊奇,如果希望指定類名互躬,可以使用name
屬性
bean Conditions
ConditionalOnBean
和ConditionalOnMissingBean
注解允許用于或確實(shí)指定的bean來進(jìn)行配置,我們可以使用value
屬性配置一個特別的類型赊时《种或者用name配置特殊的名字,search
屬性允許限制搜索ApplicationContext
中的層次結(jié)構(gòu)祖秒。
@Configuration
public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService(){...}
}
在這個方法中,myService
如果還沒有存在Spring容器中舟奠,那么它將會在這個方法中得到創(chuàng)建竭缝。
這里特別需要注意bean的啟動順序,因?yàn)樵谧鲆粋€共享庫的時候影響十分深遠(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)境屬性進(jì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表達(dá)式
該@ConditionalOnExpression
注釋允許基于一個的結(jié)果被包括配置使用SpEL表達(dá)就斤。
創(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其實(shí)是一個空的模塊刁标,它的唯一目的其實(shí)就是提供一個必要的依賴關(guān)系颠通,