1. 程式人生 > >Spring Boot2.x-06Spring Boot基礎-使用@Conditional註解根據特定的條件裝配bean

Spring Boot2.x-06Spring Boot基礎-使用@Conditional註解根據特定的條件裝配bean

概述

假設在某些特定的場景下,希望根據特定的條件去載入某個或某些bean,我們可以使用@Condtional註解, Spring 4.0的時候加入的這個註解。

在這裡插入圖片描述

例子

假設,我們在配置了資料庫的幾個屬性時,才去例項化bean,否則不初始化這個bean。這個例子可能不太合適,權當理解這個註解的用法了

Step1 實現Condition介面,重寫matches方法

package com.artisan.springbootmaster.conditional;

import org.springframework.context.annotation.Condition;
import org.
springframework.context.annotation.ConditionContext; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotatedTypeMetadata; /** * */ public class DatabaseCondtional implements Condition { /** * 資料庫bean的裝配條件 * * @param context 上下文 * @param metadata 註釋型別的元資料 * @return true 裝配Bean ,否則不裝配 */
@Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 根據context取出對應的Env資訊 Environment environment = context.getEnvironment(); // 判斷屬性檔案是否存在對應的資料庫配置 return environment.containsProperty("datasource.driverName") &&
environment.containsProperty("datasource.url") && environment.containsProperty("datasource.username") && environment.containsProperty("datasource.password"); } }

Step2 在對應的@Bean上使用@Conditional註解

package com.artisan.springbootmaster.conditional;

import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@PropertySource(value = "classpath:jdbc.properties",ignoreResourceNotFound = true)
public class Config {


    @Bean(name = "datasource" ,destroyMethod = "close")
    @Conditional(DatabaseCondtional.class)
    public DataSource initDataSource(
            @Value("${datasource.driverName}") String driver,
            @Value("${datasource.url}") String url,
            @Value("${datasource.username}") String username,
            @Value("${datasource.password}") String password){


        System.out.println("driver:" + driver + "\n url:" + url+ "\n username:" + username
        + "\n password:" + password) ;

        Properties properties = new Properties();
        properties.setProperty("driver",driver);
        properties.setProperty("url",url);
        properties.setProperty("username",username);
        properties.setProperty("password",password);

        DataSource dataSource = null;
        try {
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataSource;
    }
}


測試

package com.artisan.springbootmaster.conditional;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import javax.sql.DataSource;

public class Test {

    public static void main(String[] args){

        ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

       //DataSource dataSource = (DataSource) ctx.getBean("datasource");
        DataSource dataSource = ctx.getBean(DataSource.class);
        System.out.println("datasource:" + dataSource);

    }
}

結果 在這裡插入圖片描述

當我們修改掉某個屬性後,DatabaseCondtional#matches方法肯定返回false, 按照推測,該bean不會被載入到IoC容器中,我們來驗證下

將 datasource.driverName 改為 datasource.driverName1 在這裡插入圖片描述

重新測試,丟擲了異常。

在這裡插入圖片描述

因為我們在獲取bean的時候,IoC容器中並不存在該bean。

其他相關的註解

在這裡插入圖片描述