欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中的@Conditional?注解的使用

 更新時間:2024年01月29日 09:05:32   作者:roseduan  
@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件的才給容器注冊Bean,本文主要介紹了SpringBoot中的@Conditional?注解的使用

概述

Spring boot 中的 @Conditional 注解是一個不太常用到的注解,但確實(shí)非常的有用,我們知道 Spring Boot 是根據(jù)配置文件中的內(nèi)容,決定是否創(chuàng)建 bean,以及如何創(chuàng)建 bean 到 Spring 容器中,而 Spring boot 自動化配置的核心控制,就是 @Conditional 注解。

@Conditional 注解是 Spring 4.0 之后出的一個注解,與其搭配的一個接口是 Condition,@Conditional 注解會根據(jù)具體的條件決定是否創(chuàng)建 bean 到容器中,接下來看看 @Conditional 注解的簡單使用。

1. @Conditional 和 Condition 接口搭配使用

這里需要實(shí)現(xiàn)的功能是,我們根據(jù)配置文件中的具體內(nèi)容,來決定是否創(chuàng)建 bean,首先我們在 application.yml 中加上一個自定義配置:

在這里插入圖片描述

這里我們決定,這個配置中包含了 product 這個字符串的時候,才創(chuàng)建 bean。Product 是我自己隨便創(chuàng)建的一個實(shí)體類,你可以自行創(chuàng)建。

新建一個類 ProductCondition,內(nèi)容如下:

public class ProductCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //從配置文件中獲取屬性
        String property = conditionContext.getEnvironment().getProperty("create.bean");
        if (property != null){
            return property.contains("product");
        }
        else {
            return false;
        }
    }
}

這個類實(shí)現(xiàn)了 Condition 接口,這個接口只有一個方法,我們從配置文件中獲取剛才創(chuàng)建的自定義配置,如果配置中包含了 product 這個字符串,就會返回 true。

接下來創(chuàng)建一個配置類 ProductConfig,內(nèi)容如下:

@Configuration
public class ProductConfig {

    @Conditional(ProductCondition.class)
    @Bean(name = "product")
    public Product createProd(){
        return Product.builder().id(12312).categoryId(12).
                productName("Mac Book Pro").productImg("prod.png")
                .productPrice(18000).build();
    }
}

我們在創(chuàng)建的 bean 方法前面加上了 @Conditional 注解,判斷的標(biāo)準(zhǔn)是剛才的 ProductCondition,如果是 true,則創(chuàng)建 bean,否則不創(chuàng)建。我們寫一個測試類,來測試一下 bean 是否被創(chuàng)建了。測試代碼如下:

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class ProductConfigTest {

    @Test
    public void createProd() {
        try {
            Product product = SpringContextUtil.getBean("product", Product.class);
            if (product != null){
                System.out.println("創(chuàng)建了 bean : " + product.toString());
            }
        }
        catch (Exception e){
            log.info("發(fā)生異常,{}", e.getMessage());
            System.out.println("沒有創(chuàng)建 bean");
        }

    }
}

運(yùn)行測試代碼,發(fā)現(xiàn) bean 已經(jīng)創(chuàng)建了:

在這里插入圖片描述

如果把 application.yml 中的配置改一下,不包含 product 這個字符串,那么返回的是 false,bean 則不會被創(chuàng)建,你可以試一下。

2. @ConditionalOnClass 的使用

這個注解的屬性可以跟上一個類的完整路徑或者是類的 Class 對象,如果類存在,則會創(chuàng)建 bean,例如下面的例子:

@Configuration
public class ProductConfig {

    @ConditionalOnClass(name = "com.roseduan.demo.entity.Product")
    @Bean(name = "product")
    public Product createProd(){

        return Product.builder().id(12312).categoryId(12).
                productName("Mac Book Pro").productImg("prod.png")
                .productPrice(18000).build();
    }
}

這個路徑下面的實(shí)體類 Product 是存在的,所以會創(chuàng)建 bean,如果是一個不存在的類,則不會創(chuàng)建。

3. @ConditionalOnProperty 的使用

這個注解可以直接從配置文件中獲取屬性,然后做為是否創(chuàng)建 bean 的依據(jù)。例如我們在 application.yml 中添加一個自定義配置:

在這里插入圖片描述

ProductConfig 類的內(nèi)容是這樣的:

@Configuration
public class ProductConfig {

    @ConditionalOnProperty(value = "create.product.bean")
    @Bean(name = "product")
    public Product createProd(){

        return Product.builder().id(12312).categoryId(12).
                productName("Mac Book Pro").productImg("prod.png")
                .productPrice(18000).build();
    }
}

這里使用了 @ConditionalOnProperty 注解,從文件中讀取配置,因?yàn)槲覀冊O(shè)置的是 true,所以這個 bean 會被創(chuàng)建,如果設(shè)置成 false,則 bean 不會被創(chuàng)建,你可以自己試一下。根據(jù)這個特性,我們可以給一些特定的配置加上一個開關(guān),非常方便控制。

4.@Conditional 的實(shí)現(xiàn)子注解

springboot 提供了大量的 @Conditional 子注解供我們使用,我們只需知道有哪些常用的子注解供我們使用即可。
springboot 提供的 @Conditional 子注解有:

@ConditionalOnBean
@ConditionalOnClass
@ConditionalOnCloudPlatform
@ConditionalOnExpression
@ConditionalOnJava
@ConditionalOnJndi
@ConditionalOnMissingBean
@ConditionalOnMissingClass
@ConditionalOnNotWebApplication
@ConditionalOnProperty
@ConditionalOnResource
@ConditionalOnSingleCandidate
@ConditionalOnWarDeployment
@ConditionalOnWebApplication
這些子注解是如何實(shí)現(xiàn)的呢?我們以 @ConditionalOnBean 注解為例看下源碼:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnBean {
    Class<?>[] value() default {};

    String[] type() default {};

    Class<? extends Annotation>[] annotation() default {};

    String[] name() default {};

    SearchStrategy search() default SearchStrategy.ALL;

    Class<?>[] parameterizedContainer() default {};
}

可以看到 OnBeanCondition 是 Condition 接口的具體實(shí)現(xiàn)類。
我們挑選一些日常常用的子注解做具體的說明。

這里我只是列舉了幾個常用的注解,你可以查看官方文檔,里面有更詳細(xì)的說明:

參考文檔:官網(wǎng)文檔

到此這篇關(guān)于SpringBoot中的@Conditional 注解的使用的文章就介紹到這了,更多相關(guān)SpringBoot @Conditional注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實(shí)現(xiàn)

    Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實(shí)現(xiàn)

    這篇文章主要介紹了Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot下無節(jié)制和數(shù)據(jù)庫建立連接的問題及解決方法

    SpringBoot下無節(jié)制和數(shù)據(jù)庫建立連接的問題及解決方法

    本文介紹了無節(jié)制建立MySQL連接的危害,包括數(shù)據(jù)庫服務(wù)端資源耗盡、應(yīng)用端性能劣化和監(jiān)控與運(yùn)維困境,提出了系統(tǒng)性解決方案,包括連接池標(biāo)準(zhǔn)化配置、代碼規(guī)范與防御式編程、全鏈路監(jiān)控體系和架構(gòu)級優(yōu)化,感興趣的朋友一起看看吧
    2025-03-03
  • java中volatile關(guān)鍵字的作用詳解

    java中volatile關(guān)鍵字的作用詳解

    這篇文章主要介紹了java中volatile關(guān)鍵字的作用詳解,volatile可以保證,若一個線程改變了某塊內(nèi)存的值,其他線程是可見的,以至于其他線程能及時更新這塊內(nèi)存,需要的朋友可以參考下
    2023-09-09
  • Java中實(shí)現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    Java中實(shí)現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    文章首先介紹了Java中進(jìn)行高清圖片壓縮的基本方法,包括使用Java標(biāo)準(zhǔn)庫ImageIO和第三方庫ApacheCommonsCompress,通過示例代碼展示了如何調(diào)整圖像質(zhì)量和使用第三方工具來壓縮圖片文件,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Java中常見對象映射工具的使用詳解

    Java中常見對象映射工具的使用詳解

    對象映射是 Java 開發(fā)中的重要環(huán)節(jié),尤其在處理數(shù)據(jù)轉(zhuǎn)換時,就需要將一種結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換為另一種結(jié)構(gòu)的數(shù)據(jù)(例如 DTO 和 Entity 之間),在這篇博客中,我們將認(rèn)識并解析幾種常用的對象映射工具,并提供詳細(xì)樣例,需要的朋友可以參考下
    2025-03-03
  • idea聚合工程搭建過程詳解

    idea聚合工程搭建過程詳解

    本章主要以order訂單服務(wù)來遠(yuǎn)程調(diào)用payment支付服務(wù)為例,當(dāng)然這里只是簡單的一個遠(yuǎn)程調(diào)用,沒有太復(fù)雜的邏輯,重點(diǎn)是要掌握的是maven的聚合工程搭建,微服務(wù)分模塊的思想,每一個步驟我都會詳細(xì)記錄,并且文章下方還提供了git源碼地址
    2022-06-06
  • springboot多環(huán)境進(jìn)行動態(tài)配置的方法

    springboot多環(huán)境進(jìn)行動態(tài)配置的方法

    這篇文章主要介紹了springboot多環(huán)境下如何進(jìn)行動態(tài)配置,本文主要分享了如何在springboot的項(xiàng)目中使用多環(huán)境配置,重點(diǎn)是”spring.profiles.active“屬性,需要的朋友可以參考下
    2022-06-06
  • JavaWeb利用struts實(shí)現(xiàn)文件下載時改變文件名稱

    JavaWeb利用struts實(shí)現(xiàn)文件下載時改變文件名稱

    這篇文章主要為大家詳細(xì)介紹了JavaWeb利用struts實(shí)現(xiàn)文件下載時改變文件名稱的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • java編程中實(shí)現(xiàn)調(diào)用js方法分析

    java編程中實(shí)現(xiàn)調(diào)用js方法分析

    這篇文章主要介紹了java編程中實(shí)現(xiàn)調(diào)用js方法,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了java編程中調(diào)用js方法的常用操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-09-09
  • java限流算法詳細(xì)

    java限流算法詳細(xì)

    這篇文章詳細(xì)的介紹了java限流算法常用到的算法計(jì)數(shù)算法、漏桶算法、令牌桶等算法的相關(guān)資料,需要的朋友可以參考下文,希望本篇文章能幫助到您
    2021-09-09

最新評論