Spring條件註解@Conditional,SpringBoot中組合條件你知道嗎?

導讀:當咱們構建一個 Spring 應用的時候,有時咱們想在知足指定條件的時候纔將某個 bean 加載到應用上下文中, Spring 4提供了一個更通用的基於條件的Bean的建立方式,即便用@Conditional註解,咱們能夠經過 @Conditional 註解來實現這類操做。web

@Conditional 元註解源碼

圖片

圖片

Conditional 接口源碼

咱們看到 @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,自行查看這些註解,瞭解更多具體內容。(共勉:多看源碼,學習大神的代碼設計) 

原文地址:Spring條件註解@Conditional,SpringBoot中組合條件你知道嗎?

相關文章
相關標籤/搜索