服务器之家

服务器之家 > 正文

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

时间:2021-07-29 11:28     来源/作者:roseduan

概述

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 中加上一个自定义配置:

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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,内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
@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 是否被创建了。测试代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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 已经创建了:

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

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

2. @conditionalonclass 的使用

这个注解的属性可以跟上一个类的完整路径或者是类的 class 对象,如果类存在,则会创建 bean,例如下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
@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 中添加一个自定义配置:

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

productconfig 类的内容是这样的:

?
1
2
3
4
5
6
7
8
9
10
11
12
@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 官网文档

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

原文链接:https://segmentfault.com/a/1190000018777937

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部