浅谈SpringBoot中的@Conditional注解的使用

 更新时间:2019年04月07日 09:06:39   作者:roseduan  
这篇文章主要介绍了浅谈SpringBoot中的@Conditional注解的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

概述

Spring boot 中的 @Conditional 注解是一个不太常用到的注解,但确实非常的有用,我们知道 Spring Boot 是根据配置文件中的内容,决定是否创建 bean,以及如何创建 bean 到 Spring 容器中,而 Spring boot 自动化配置的核心控制,就是 @Conditional 注解。

@Conditional 注解是 Spring 4.0 之后出的一个注解,与其搭配的一个接口是 Condition,@Conditional 注解会根据具体的条件决定是否创建 bean 到容器中,接下来看看 @Conditional 注解的简单使用。

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

这里需要实现的功能是,我们根据配置文件中的具体内容,来决定是否创建 bean,首先我们在 application.yml 中加上一个自定义配置:

这里我们决定,这个配置中包含了 product 这个字符串的时候,才创建 bean。Product 是我自己随便创建的一个实体类,你可以自行创建。

新建一个类 ProductCondition,内容如下:

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;
    }
  }
}

这个类实现了 Condition 接口,这个接口只有一个方法,我们从配置文件中获取刚才创建的自定义配置,如果配置中包含了 product 这个字符串,就会返回 true。

接下来创建一个配置类 ProductConfig,内容如下:

@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();
  }
}

我们在创建的 bean 方法前面加上了 @Conditional 注解,判断的标准是刚才的 ProductCondition,如果是 true,则创建 bean,否则不创建。我们写一个测试类,来测试一下 bean 是否被创建了。测试代码如下:

@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("创建了 bean : " + product.toString());
      }
    }
    catch (Exception e){
      log.info("发生异常,{}", e.getMessage());
      System.out.println("没有创建 bean");
    }

  }
}

运行测试代码,发现 bean 已经创建了:

如果把 application.yml 中的配置改一下,不包含 product 这个字符串,那么返回的是 false,bean 则不会被创建,你可以试一下。

2. @ConditionalOnClass 的使用

这个注解的属性可以跟上一个类的完整路径或者是类的 Class 对象,如果类存在,则会创建 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 是存在的,所以会创建 bean,如果是一个不存在的类,则不会创建。

3. @ConditionalOnProperty 的使用

这个注解可以直接从配置文件中获取属性,然后做为是否创建 bean 的依据。例如我们在 application.yml 中添加一个自定义配置:

ProductConfig 类的内容是这样的:

@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 会被创建,如果设置成 false,则 bean 不会被创建,你可以自己试一下。根据这个特性,我们可以给一些特定的配置加上一个开关,非常方便控制。

这里我只是列举了几个常用的注解,你可以查看官方文档,里面有更详细的说明:

参考文档:Spring Boot 官网文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中对AtomicInteger和int值在多线程下递增操作的测试

    Java中对AtomicInteger和int值在多线程下递增操作的测试

    这篇文章主要介绍了Java中对AtomicInteger和int值在多线程下递增操作的测试,本文得出AtomicInteger操作 与 int操作的效率大致相差在50-80倍上下的结论,需要的朋友可以参考下
    2014-09-09
  • Intellij IDEA命令行执行java无法加载主类解决方案

    Intellij IDEA命令行执行java无法加载主类解决方案

    这篇文章主要介绍了Intellij IDEA命令行执行java无法加载主类解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 详解基于IDEA2020.1的JAVA代码提示插件开发例子

    详解基于IDEA2020.1的JAVA代码提示插件开发例子

    这篇文章主要介绍了详解基于IDEA2020.1的JAVA代码提示插件开发例子,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java面向对象之学生信息管理系统

    java面向对象之学生信息管理系统

    这篇文章主要为大家详细介绍了java面向对象之学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • mybatis-sqlserver批量新增返回id方式

    mybatis-sqlserver批量新增返回id方式

    这篇文章主要介绍了mybatis-sqlserver批量新增返回id方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java实现飞机游戏代码

    java实现飞机游戏代码

    这篇文章主要为大家详细介绍了java实现飞机游戏代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Mybatis下动态sql中##和$$的区别讲解

    Mybatis下动态sql中##和$$的区别讲解

    今天小编就为大家分享一篇关于Mybatis下动态sql中##和$$的区别讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java精确抽取网页发布时间

    Java精确抽取网页发布时间

    这篇文章主要为大家详细介绍了Java精确抽取网页发布时间的相关资料,尽量做到精确无误,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 混乱的Java日志体系及集成jar包梳理分析

    混乱的Java日志体系及集成jar包梳理分析

    这篇文章主要详细的为大家梳理分析了剪不断理还乱的Java日志体系,以及日志系统涉及到的繁杂的各种集成 jar 包,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03
  • Java中对于双属性枚举的使用案例

    Java中对于双属性枚举的使用案例

    今天小编就为大家分享一篇关于Java中对于双属性枚举的使用案例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论