最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中的@Conditional?注解的使用

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

概述

Spring boot 中的 @Conditional 注解是一個不太常用到的注解,但確實非常的有用,我們知道 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 接口搭配使用

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

在這里插入圖片描述

這里我們決定,這個配置中包含了 product 這個字符串的時候,才創(chuàng)建 bean。Product 是我自己隨便創(chuàng)建的一個實體類,你可以自行創(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;
        }
    }
}

這個類實現(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 注解,判斷的標準是剛才的 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");
        }

    }
}

運行測試代碼,發(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();
    }
}

這個路徑下面的實體類 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 注解,從文件中讀取配置,因為我們設置的是 true,所以這個 bean 會被創(chuàng)建,如果設置成 false,則 bean 不會被創(chuàng)建,你可以自己試一下。根據(jù)這個特性,我們可以給一些特定的配置加上一個開關(guān),非常方便控制。

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

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

@ConditionalOnBean
@ConditionalOnClass
@ConditionalOnCloudPlatform
@ConditionalOnExpression
@ConditionalOnJava
@ConditionalOnJndi
@ConditionalOnMissingBean
@ConditionalOnMissingClass
@ConditionalOnNotWebApplication
@ConditionalOnProperty
@ConditionalOnResource
@ConditionalOnSingleCandidate
@ConditionalOnWarDeployment
@ConditionalOnWebApplication
這些子注解是如何實現(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 接口的具體實現(xiàn)類。
我們挑選一些日常常用的子注解做具體的說明。

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

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

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

相關(guān)文章

  • java Timer測試定時調(diào)用及固定時間執(zhí)行代碼示例

    java Timer測試定時調(diào)用及固定時間執(zhí)行代碼示例

    這篇文章主要介紹了java Timer測試定時調(diào)用及固定時間執(zhí)行代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • ReentrantLock實現(xiàn)原理詳解

    ReentrantLock實現(xiàn)原理詳解

    本文將對ReentrantLock實現(xiàn)原理進行詳細的介紹,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • IDEA運行SpringBoot項目的超詳細步驟截圖

    IDEA運行SpringBoot項目的超詳細步驟截圖

    在當前的開發(fā)中Spring Boot開發(fā)框架已經(jīng)成為主流,下面這篇文章主要給大家介紹了關(guān)于IDEA運行SpringBoot項目的超詳細步驟截圖,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • 如何通過Java實現(xiàn)加密、解密Word文檔

    如何通過Java實現(xiàn)加密、解密Word文檔

    這篇文章主要介紹了如何通過Java實現(xiàn)加密、解密Word文檔,對一些重要文檔,常需要對文件進行加密,查看文件時,需要正確輸入密碼才能打開文件。下面介紹了一種比較簡單的方法給Word文件加密以及如何給已加密的Word文件解除密碼保護,需要的朋友可以參考下
    2019-07-07
  • Spring的FactoryBean<Object>接口示例代碼

    Spring的FactoryBean<Object>接口示例代碼

    FactoryBean是Spring框架中的一個接口,用于創(chuàng)建和管理Bean對象,它的作用是將Bean的創(chuàng)建過程交給FactoryBean實現(xiàn)類來完成,而不是直接由Spring容器來創(chuàng)建,本文給大家介紹Spring的FactoryBean<Object>接口,感興趣的朋友一起看看吧
    2023-11-11
  • 修改若依框架Token的過期時間問題

    修改若依框架Token的過期時間問題

    本文介紹了如何修改若依框架中Token的過期時間,通過修改`application.yml`文件中的配置來實現(xiàn),默認單位為分鐘,希望此經(jīng)驗對大家有所幫助,也歡迎支持腳本之家
    2025-02-02
  • 淺談Android開發(fā)中項目的文件結(jié)構(gòu)及規(guī)范化部署建議

    淺談Android開發(fā)中項目的文件結(jié)構(gòu)及規(guī)范化部署建議

    這篇文章主要介紹了Android開發(fā)中項目的文件結(jié)構(gòu)及規(guī)范化部署建議,組織好代碼文件的結(jié)構(gòu)有利于維護團隊合作的效率,需要的朋友可以參考下
    2016-03-03
  • java基礎(chǔ)二叉搜索樹圖文詳解

    java基礎(chǔ)二叉搜索樹圖文詳解

    二叉樹是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它同時具有數(shù)組和鏈表各自的特點,下面這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)二叉搜索樹的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Java中API的使用方法詳情

    Java中API的使用方法詳情

    這篇文章主要介紹了Java中API的使用方法詳情,指的就是?JDK?中提供的各種功能的?Java類,這些類將底層的實現(xiàn)封裝了起來,我們不需要關(guān)心這些類是如何實現(xiàn)的,只需要學習這些類如何使用即可,我們可以通過幫助文檔來學習這些API如何使用,需要的朋友可以參考下
    2022-04-04
  • Springboot集成knife4j實現(xiàn)風格化API文檔

    Springboot集成knife4j實現(xiàn)風格化API文檔

    這篇文章主要介紹了Springboot如何集成knife4j實現(xiàn)風格化API文檔,幫助大家更好的使用springboot框架,感興趣的朋友可以了解下
    2020-12-12

最新評論

赤水市| 临朐县| 阿瓦提县| 临邑县| 正定县| 常德市| 从江县| 安康市| 酉阳| 白河县| 左云县| 玉龙| 湾仔区| 南充市| 田林县| 柳江县| 松溪县| 宝清县| 台东县| 荥经县| 修武县| 镶黄旗| 鲁甸县| 建德市| 伊宁市| 精河县| 修水县| 津南区| 从江县| 普兰店市| 故城县| 聊城市| 子长县| 讷河市| 旬阳县| 启东市| 彭山县| 互助| 平和县| 平凉市| 湖口县|