溫馨提示×

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

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

Spring Boot @Condition 注解,組合條件你知道嗎

發(fā)布時(shí)間:2020-08-07 21:10:18 來(lái)源:網(wǎng)絡(luò) 閱讀:460 作者:日拱一兵 欄目:編程語(yǔ)言

上一篇文章 你應(yīng)該知道的 @ConfigurationProperties 注解的使用姿勢(shì),這一篇就夠了 介紹了如何通過(guò) @ConfigurationProperties 注解靈活讀取配置屬性,這篇文章將介紹如何靈活配置 Spring Bean

寫(xiě)在前面

當(dāng)我們構(gòu)建一個(gè) Spring 應(yīng)用的時(shí)候,有時(shí)我們想在滿足指定條件的時(shí)候才將某個(gè) bean 加載到應(yīng)用上下文中, 在Spring 4.0 時(shí)代,我們可以通過(guò) @Conditional 注解來(lái)實(shí)現(xiàn)這類操作
Spring Boot @Condition 注解,組合條件你知道嗎

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

看到接口的 matches 方法返回的是 boolean 類型,是不是和我們自定義 validation annotation 有些類似,都是用來(lái)判斷是否滿足指定條件。另外注意看,以上注解和接口都在 org.springframework.context.annotation package 中

終于到了 Spring Boot 時(shí)代,在這個(gè)全新的時(shí)代,Spring Boot 在 @Conditional 注解的基礎(chǔ)上進(jìn)行了細(xì)化,無(wú)需出示復(fù)雜的介紹信 (實(shí)現(xiàn) Condition 接口),只需要手持預(yù)定義好的 @ConditionalOnXxxx 注解印章的門(mén)票,如果驗(yàn)證通過(guò),就會(huì)走進(jìn) Application Context 大廳

注解詳解

Spring Boot 對(duì) @Conditional 注解為我們做了細(xì)化,這些注解都定義在 org.springframework.boot.autoconfigure.condition package 下
Spring Boot @Condition 注解,組合條件你知道嗎

逐個(gè)打開(kāi)這 13 個(gè)注解,我們發(fā)現(xiàn)這些注解上有相同的元注解:
Spring Boot @Condition 注解,組合條件你知道嗎

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

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

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

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

Spring Boot @Condition 注解,組合條件你知道嗎

其實(shí)看這些注解字面意思已經(jīng)能理解這些注解的含義,但是我們還是要說(shuō)明具體的使用以及一些注意事項(xiàng),我按照個(gè)人使用頻次由高到低講解:

@ConditionalOnProperty

毫無(wú)疑問(wèn)這個(gè)注解是榜首
Spring Boot @Condition 注解,組合條件你知道嗎

這個(gè)條件解釋是: application.properties 或 application.yml 文件中 mybean.enable 為 true 才會(huì)加載 MyCondition 這個(gè) Bean,如果沒(méi)有匹配上也會(huì)加載,因?yàn)?matchIfMissing = true,默認(rèn)值是 false。
Spring Boot @Condition 注解,組合條件你知道嗎

@ConditionalOnBean 和 ConditionalOnMissingBean

有時(shí)候我們需要某個(gè) Bean 已經(jīng)存在應(yīng)用上下文時(shí)才會(huì)加載,那么我們會(huì)用到 @ConditionalOnBean 注解:
Spring Boot @Condition 注解,組合條件你知道嗎

與之相反,有時(shí)候我們需要某個(gè) Bean 不存在于應(yīng)用上下文時(shí)才會(huì)加載,那么我們會(huì)用到 @ConditionalOnMissingBean 注解

@ConditionalOnClass 和 @ConditionalOnMissingClass

不要嫌我廢話,和上面的一樣,只不過(guò)判斷某個(gè)類是否存在于 classpath 中,這就不做過(guò)多說(shuō)明了

@ConditionalOnExpression

如果我們有更復(fù)雜的多個(gè)配置屬性一起判斷,那么我們就可以用這個(gè)表達(dá)式了:
Spring Boot @Condition 注解,組合條件你知道嗎

只有當(dāng)兩個(gè)屬性都為 true 的時(shí)候才加載 MyModule,到這里要順便揭曉上一篇文章 你應(yīng)該知道的 @ConfigurationProperties 注解的使用姿勢(shì),這一篇就夠了 靈魂追問(wèn) 3,其中 :true 就是: 如果沒(méi)有為該屬性設(shè)置值,則為該屬性設(shè)置默認(rèn)值true, 其實(shí)這就是@Vaue 注解的規(guī)范,一切 SpEL 都可以應(yīng)用在這里.

寫(xiě)到這,我常用的已經(jīng)用完了,還要硬著頭皮介紹其他幾個(gè)內(nèi)容

向AI問(wèn)一下細(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