Spring Boot @Condition 註解,組合條件你知道嗎
上一篇文章 你應該知道的 @ConfigurationProperties 註解的使用姿勢,這一篇就夠了 介紹瞭如何通過 @ConfigurationProperties
註解靈活讀取配置屬性,這篇文章將介紹如何靈活配置 Spring Bean
寫在前面
當我們構建一個 Spring 應用的時候,有時我們想在滿足指定條件的時候才將某個 bean 載入到應用上下文中, 在Spring 4.0 時代,我們可以通過 @Conditional
註解來實現這類操作
我們看到 @Conditional
註解接收的引數是 extends Condition 介面的泛型類,也就是說,我們要使用 @Conditional
看到介面的 matches 方法返回的是 boolean 型別,是不是和我們自定義 validation annotation 有些類似,都是用來判斷是否滿足指定條件。另外注意看,以上註解和介面都在 org.springframework.context.annotation
package 中
終於到了 Spring Boot 時代,在這個全新的時代,Spring Boot 在 @Conditional
註解的基礎上進行了細化,無需出示複雜的介紹信 (實現 Condition 介面),只需要手持預定義好的 @ConditionalOnXxxx
註解詳解
Spring Boot 對 @Conditional
註解為我們做了細化,這些註解都定義在 org.springframework.boot.autoconfigure.condition
package 下
逐個開啟這 13 個註解,我們發現這些註解上有相同的元註解:
從這些標記上我們可以瞭解如下內容:
都可以應用在 TYPE 上,也就是說,Spring 自動掃描的一切類 (@Configuration, @Component, @Service, @Repository, or @Controller) 都可以通過新增相應的
@ConditionalOnXxxx
都可以應用在 METHOD 上,所以有 @Bean 標記的方法也可以應用這些註解
都是用了
@Conditional
註解來標記,OnBeanCondition 等自定義 Condition 還是實現了 Condition 介面的,換湯不換藥,沒什麼神祕的,只不過做了更具象的封裝罷了,來看類依賴圖:
其實看這些註解字面意思已經能理解這些註解的含義,但是我們還是要說明具體的使用以及一些注意事項,我按照個人使用頻次由高到低講解:
@ConditionalOnProperty
毫無疑問這個註解是榜首
這個條件解釋是: application.properties 或 application.yml 檔案中 mybean.enable 為 true 才會載入 MyCondition 這個 Bean,如果沒有匹配上也會載入,因為 matchIfMissing = true,預設值是 false。
@ConditionalOnBean 和 ConditionalOnMissingBean
有時候我們需要某個 Bean 已經存在應用上下文時才會載入,那麼我們會用到 @ConditionalOnBean
註解:
與之相反,有時候我們需要某個 Bean 不存在於應用上下文時才會載入,那麼我們會用到 @ConditionalOnMissingBean
註解
@ConditionalOnClass 和 @ConditionalOnMissingClass
不要嫌我廢話,和上面的一樣,只不過判斷某個類是否存在於 classpath 中,這就不做過多說明了
@ConditionalOnExpression
如果我們有更復雜的多個配置屬性一起判斷,那麼我們就可以用這個表示式了:
只有當兩個屬性都為 true 的時候才載入 MyModule,到這裡要順便揭曉上一篇文章 你應該知道的 @ConfigurationProperties 註解的使用姿勢,這一篇就夠了 靈魂追問 3,其中 :true
就是: 如果沒有為該屬性設定值,則為該屬性設定預設值true, 其實這就是@Vaue
註解的規範,一切 SpEL 都可以應用在這裡.
寫到這,我常用的已經用完了,還要硬著頭皮介紹其他幾個內容