溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring中@Conditional條件注解如何使用

發(fā)布時(shí)間:2021-08-06 15:06:51 來(lái)源:億速云 閱讀:161 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)Spring中@Conditional條件注解如何使用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。


@Conditional 元注解源

Spring中@Conditional條件注解如何使用

Spring中@Conditional條件注解如何使用

Conditional 接口源碼

我們看到 @Conditional 注解接收的參數(shù)是 extends Condition 接口的泛型類,也就是說(shuō),我們要使用 @Conditional 注解,只需要實(shí)現(xiàn) Condition 接口并重寫其方法即可:

Spring中@Conditional條件注解如何使用

Spring中@Conditional條件注解如何使用

簡(jiǎn)單找下Spring家族其他的案例實(shí)現(xiàn)SpringBootCondition

Spring中@Conditional條件注解如何使用

Spring中@Conditional條件注解如何使用

Spring Boot使用的所有Condition實(shí)現(xiàn)的基礎(chǔ)。提供合理的日志記錄,以幫助用戶診斷要加載的類。

無(wú)意中在網(wǎng)上看到一種比較形象的理解:如果將Application Context 比作大廳,Spring Boot 在 @Conditional 注解的基礎(chǔ)上進(jìn)行了細(xì)化,無(wú)需出示復(fù)雜的介紹信 (實(shí)現(xiàn) Condition 接口),只需要手持預(yù)定義好的 @ConditionalOnXxxx 注解印章的門票,如果驗(yàn)證通過,就會(huì)走進(jìn) Application Context 大廳SpringBoot Condition 拓展實(shí)現(xiàn)

Spring中@Conditional條件注解如何使用

逐個(gè)打開這 13 個(gè)注解,我們發(fā)現(xiàn)這些注解上有相同的元注解

Spring中@Conditional條件注解如何使用

從這些標(biāo)記上我們可以了解如下內(nèi)容:

  • 都可以應(yīng)用在 TYPE 上,也就是說(shuō),Spring 自動(dòng)掃描的一切類 (@Configuration, @Component, @Service, @Repository, or @Controller) 都可以通過添加相應(yīng)的 @ConditionalOnXxxx 來(lái)判斷是否加載

  • 都可以應(yīng)用在 METHOD 上,所以有 @Bean 標(biāo)記的方法也可以應(yīng)用這些注解

  • 都是用了 @Conditional 注解來(lái)標(biāo)記,OnBeanCondition 等自定義 Condition 還是實(shí)現(xiàn)了 Condition 接口的,換湯不換藥,沒什么神秘的,只不過做了更具象的封裝罷了,來(lái)看類依賴圖(簡(jiǎn)化的類圖)

Spring中@Conditional條件注解如何使用

其實(shí)用法都大同小異,看了源碼以后發(fā)現(xiàn)原理很簡(jiǎn)單,這里簡(jiǎn)單歸納下用法:

除了自己自定義Condition之外,Spring還提供了很多Condition給我們用

  • @ConditionalOnBean
    僅僅在當(dāng)前上下文中存在某個(gè)對(duì)象時(shí),才會(huì)實(shí)例化一個(gè)Bean

  • @ConditionalOnClass
    某個(gè)class位于類路徑上,才會(huì)實(shí)例化一個(gè)Bean

  • @ConditionalOnExpression
    當(dāng)表達(dá)式為true的時(shí)候,才會(huì)實(shí)例化一個(gè)Bean

  • @ConditionalOnMissingBean
    僅僅在當(dāng)前上下文中不存在某個(gè)對(duì)象時(shí),才會(huì)實(shí)例化一個(gè)Bean

  • @ConditionalOnMissingClass
    某個(gè)class類路徑上不存在的時(shí)候,才會(huì)實(shí)例化一個(gè)Bean

  • @ConditionalOnNotWebApplication
    不是web應(yīng)用

  • @ConditionalOnProperty
    指在配置里配置的屬性是否為true,才會(huì)實(shí)例化一個(gè)Bean)

  • @ConditionalOnResource
    如果我們要加載的 bean 依賴指定資源是否存在于 classpath 中,那么我們就可以使用這個(gè)注解

  • @ConditionalOnJndi
    只有指定的資源通過 JNDI 加載后才加載 bean

  • @ConditionalOnCloudPlatform
    只有運(yùn)行在指定的云平臺(tái)上才加載指定的 bean,CloudPlatform 是 org.springframework.boot.cloud 下一個(gè) enum 類型的類,大家可以打開自行看看

關(guān)于Spring中@Conditional條件注解如何使用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI