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

淺談SpringBoot中的@Conditional注解的使用

 更新時(shí)間:2019年04月07日 09:06:39   作者:roseduan  
這篇文章主要介紹了淺談SpringBoot中的@Conditional注解的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

概述

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

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

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

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

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

新建一個(gè)類 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;
    }
  }
}

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

接下來創(chuàng)建一個(gè)配置類 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)建。我們寫一個(gè)測試類,來測試一下 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 這個(gè)字符串,那么返回的是 false,bean 則不會(huì)被創(chuàng)建,你可以試一下。

2. @ConditionalOnClass 的使用

這個(gè)注解的屬性可以跟上一個(gè)類的完整路徑或者是類的 Class 對象,如果類存在,則會(huì)創(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();
  }
}

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

3. @ConditionalOnProperty 的使用

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

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,所以這個(gè) bean 會(huì)被創(chuàng)建,如果設(shè)置成 false,則 bean 不會(huì)被創(chuàng)建,你可以自己試一下。根據(jù)這個(gè)特性,我們可以給一些特定的配置加上一個(gè)開關(guān),非常方便控制。

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot接口防抖(防重復(fù)提交)的實(shí)現(xiàn)方案

    SpringBoot接口防抖(防重復(fù)提交)的實(shí)現(xiàn)方案

    所謂防抖,一是防用戶手抖,二是防網(wǎng)絡(luò)抖動(dòng),在Web系統(tǒng)中,表單提交是一個(gè)非常常見的功能,如果不加控制,容易因?yàn)橛脩舻恼`操作或網(wǎng)絡(luò)延遲導(dǎo)致同一請求被發(fā)送多次,所以本文給大家介紹了SpringBoot接口防抖(防重復(fù)提交)的實(shí)現(xiàn)方案,需要的朋友可以參考下
    2024-04-04
  • Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)

    Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)

    下面小編就為大家?guī)硪黄狫ava數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • SpringBoot整合Swagger3的流程詳解

    SpringBoot整合Swagger3的流程詳解

    這篇文章主要介紹了SpringBoot整合Swagger3的流程詳解,Swagger最核心的類就是Docket、它可以配置作者信息、掃描類型,在SwaggerConfig配置類,添加@Configuration和@EnableOpenApi注解,需要的朋友可以參考下
    2024-01-01
  • 完美解決IDEA Ctrl+Shift+f快捷鍵突然無效的問題

    完美解決IDEA Ctrl+Shift+f快捷鍵突然無效的問題

    這篇文章主要介紹了完美解決IDEA Ctrl+Shift+f快捷鍵突然無效的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java ThreadPoolExecutor 并發(fā)調(diào)用實(shí)例詳解

    java ThreadPoolExecutor 并發(fā)調(diào)用實(shí)例詳解

    這篇文章主要介紹了java ThreadPoolExecutor 并發(fā)調(diào)用實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SpringBoot配置文件高級用法實(shí)戰(zhàn)分享

    SpringBoot配置文件高級用法實(shí)戰(zhàn)分享

    Spring Boot配置文件的優(yōu)先級是一個(gè)重要的概念,它決定了當(dāng)存在多個(gè)配置文件時(shí),哪個(gè)配置文件中的配置將被優(yōu)先采用,本文給大家介紹了SpringBoot配置文件高級用法實(shí)戰(zhàn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • JAVA為什么要使用封裝及如何封裝經(jīng)典實(shí)例

    JAVA為什么要使用封裝及如何封裝經(jīng)典實(shí)例

    這篇文章主要給大家介紹了關(guān)于JAVA為什么要使用封裝及如何封裝的相關(guān)資料,封裝就是將屬性私有化,提供公有的方法訪問私有屬性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Java深入講解二十三種設(shè)計(jì)模式之中的策略模式

    Java深入講解二十三種設(shè)計(jì)模式之中的策略模式

    策略模式屬于Java 23種設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來,使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下
    2022-05-05
  • SpringBoot實(shí)現(xiàn)文件下載功能的方式分享

    SpringBoot實(shí)現(xiàn)文件下載功能的方式分享

    這篇文章主要為大家詳細(xì)介紹了SpringBoot這哪個(gè)實(shí)現(xiàn)文件下載功能的幾種方式,文中的實(shí)現(xiàn)方法簡介易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • 一分鐘了解Java中List集合與set集合的多種遍歷方式

    一分鐘了解Java中List集合與set集合的多種遍歷方式

    這篇文章主要介紹了一分鐘了解Java中List集合與set集合的多種遍歷方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

财经| 东莞市| 昭通市| 洛南县| 泰来县| 弥渡县| 宁强县| 锡林郭勒盟| 邯郸县| 临澧县| 信宜市| 安新县| 阿图什市| 阿尔山市| 顺昌县| 石泉县| 中江县| 扬州市| 勐海县| 亚东县| 厦门市| 海城市| 神农架林区| 县级市| 霞浦县| 普安县| 兴安县| 石泉县| 兴义市| 渑池县| 岐山县| 海淀区| 桐城市| 且末县| 鄄城县| 永丰县| 屯留县| 房产| 曲周县| 清涧县| 囊谦县|