導讀:當咱們構建一個 Spring 應用的時候,有時咱們想在知足指定條件的時候纔將某個 bean 加載到應用上下文中, Spring 4提供了一個更通用的基於條件的Bean的建立方式,即便用@Conditional註解,咱們能夠經過 @Conditional 註解來實現這類操做。web
咱們看到 @Conditional 註解接收的參數是 extends Condition 接口的泛型類,也就是說,咱們要使用 @Conditional 註解,只須要實現 Condition 接口並重寫其方法便可:spring
簡單找下Spring家族其餘的案例實現SpringBootConditionmarkdown
Spring Boot使用的全部Condition實現的基礎。提供合理的日誌記錄,以幫助用戶診斷要加載的類。oop
無心中在網上看到一種比較形象的理解:若是將Application Context 比做大廳,Spring Boot 在 @Conditional 註解的基礎上進行了細化,無需出示複雜的介紹信 (實現 Condition 接口),只須要手持預約義好的 @ConditionalOnXxxx 註解印章的門票,若是驗證經過,就會走進 Application Context 大廳學習
SpringBoot Condition 拓展實現spa
逐個打開這 13 個註解,咱們發現這些註解上有相同的元註解設計
從這些標記上咱們能夠了解以下內容:日誌
均可以應用在 TYPE 上,也就是說,Spring 自動掃描的一切類 (@Configuration, @Component, @Service, @Repository, or @Controller) 均可以經過添加相應的 @ConditionalOnXxxx 來判斷是否加載code
均可以應用在 METHOD 上,因此有 @Bean 標記的方法也能夠應用這些註解orm
都是用了 @Conditional 註解來標記,OnBeanCondition 等自定義 Condition 仍是實現了 Condition 接口的,換湯不換藥,沒什麼神祕的,只不過作了更具象的封裝罷了,來看類依賴圖(簡化的類圖)
其實用法都大同小異,看了源碼之後發現原理很簡單,這裏簡單概括下用法:
除了本身自定義Condition以外,Spring還提供了不少Condition給咱們用
@ConditionalOnBean
僅僅在當前上下文中存在某個對象時,纔會實例化一個Bean
@ConditionalOnClass
某個class位於類路徑上,纔會實例化一個Bean
@ConditionalOnExpression
當表達式爲true的時候,纔會實例化一個Bean
@ConditionalOnMissingBean
僅僅在當前上下文中不存在某個對象時,纔會實例化一個Bean
@ConditionalOnMissingClass
某個class類路徑上不存在的時候,纔會實例化一個Bean
@ConditionalOnNotWebApplication
不是web應用
@ConditionalOnProperty
指在配置裏配置的屬性是否爲true,纔會實例化一個Bean)
@ConditionalOnResource
若是咱們要加載的 bean 依賴指定資源是否存在於 classpath 中,那麼咱們就能夠使用這個註解
@ConditionalOnJndi
只有指定的資源經過 JNDI 加載後才加載 bean
@ConditionalOnCloudPlatform
只有運行在指定的雲平臺上才加載指定的 bean,CloudPlatform 是 org.springframework.boot.cloud 下一個 enum 類型的類,你們能夠打開自行看看
到這裏,你已經瞭解瞭如何靈活配置 bean,但願你們打開 IDE,自行查看這些註解,瞭解更多具體內容。(共勉:多看源碼,學習大神的代碼設計)