天天看點

《SpringBoot揭秘:快速建構微服務體系》—第3章3.4節再談自動配置

本節書摘來自華章出版社《springboot揭秘:快速建構微服務體系》一書中的第3章,第3.4節再談自動配置,作者王福強,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

3.4 再談自動配置

此前我們講到,@enableautoconfiguration可以借助springfactoriesloader這個特性将标注了@configuration的javaconfig類“一股腦兒”的彙總并加載到最終的applicationcontext,不過,這其實隻是“簡化版”的說明,實際上,基于@enableautoconfiguration的自動配置功能擁有更加強大的調控能力,通過配合比如基于條件的配置能力或者調整加載順序,我們可以對自動配置進行更加細粒度的調整和控制。

3.4.1 基于條件的自動配置

基于條件的自動配置來源于spring架構中“基于條件的配置”這一特性。在spring架構中,我們可以使用@conditional這個annotation配合@configuration或者@bean等annotation來幹預一個配置或者bean定義是否能夠生效,其最終實作的效果或者語義類似于如下僞代碼:

if(符合@conditional規定的條件){

}

要實作基于條件的配置,我們隻要通過@conditional指定自己的condition實作類就可以了(可以應用于類型type的标注或者方法method的标注):

@conditional({mycondition1.class, mycondition2.class, ...})

最主要的是,@conditional可以作為一個meta annotation用來标注其他annotation實作類,進而建構各色的複合annotation,比如springboot的autoconfigure子產品就基于這一優良的革命傳統,實作了一批這樣的annotation(位于org.springframework.boot.autoconfigure.condition包下):

有了這些複合annotation的配合,我們就可以結合@enableauto-configurationn實作基于條件的自動配置了。

springboot能夠風靡,很大一部分功勞需要歸功于它預先提供的一系列自動配置的依賴子產品,而這些依賴子產品都是基于以上@conditional複合annotation實作的,這也意味着所有的這些依賴子產品都是按需加載的,隻有符合某些特定條件,這些依賴子產品才會生效,這也就是我們所謂的“智能”自動配置。

3.4.2 調整自動配置的順序

在實作自動配置的過程中,除了可以提供基于條件的配置,我們還可以對目前要提供的配置或者元件的加載順序進行相應調整,進而讓這些配置或者元件之間的依賴分析群組裝可以順利完成。

我們可以使用@org.springframework.boot.autoconfigure.autoconfigurebefore或者@org.springframework.boot.autoconfigure.autoconfigureafter讓目前配置或者元件在某個其他元件之前或者之後進行,比如,假設我們希望某些jmx操作相關的bean定義在mbeanserver配置完成之後進行,那麼我們就可以提供一個類似如下的配置: