淺談 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 官網文檔

相關文章
相關標籤/搜索