浅谈 Spring Boot 中的 @Conditional 注解

概述

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

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

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

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

图片描述

这里咱们决定,这个配置中包含了 product 这个字符串的时候,才建立 bean。Product 是我本身随便建立的一个实体类,你能够自行建立。app

新建一个类 ProductCondition,内容以下:ide

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。spring-boot

接下来建立一个配置类 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 是否被建立了。测试代码以下:ui

@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 已经建立了:spa

图片描述

若是把 application.yml 中的配置改一下,不包含 product 这个字符串,那么返回的是 false,bean 则不会被建立,你能够试一下。3d

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 官网文档

相关文章
相关标签/搜索