1. 程式人生 > >Spring Boot IoC學習(七)條件裝配Bean

Spring Boot IoC學習(七)條件裝配Bean

七、條件裝配Bean

有時候某些客觀因素會使得一些Bean無法進行初始化,例如資料庫連線池的配置中漏掉一些配置會造成資料來源不能連線上。這樣的情況下,IoC容器如果還進行資料來源的裝配,則系統將會丟擲異常,導致應用無法繼續,這種情況下我們不希望IoC容器去裝配資料來源。

為了處理這樣的場景,Spring提供了@Conditianal註解幫助我們,它需要配合另外一個介面Condition(org.springframeword.context.annotation.Condition)來完成對應的功能。

註解@Conditional

我們實現根據條件裝配資料來源

資料來源Bean

@Configuration
public class AppConfig { @Bean(name = "dataSource", destroyMethod = "close") @Conditional(value = DataBaseConditional.class) public DataSource getDataSource( @Value("${test1.driverName}") String driver, @Value("${test1.url}") String url, @Value("${test1.username}") String username,
@Value("${test1.password}") String password) { Properties prop = new Properties(); prop.setProperty("driver", driver); prop.setProperty("url", url); prop.setProperty("username", username); prop.setProperty("password", password); DataSource dataSource = null; try { dataSource =
BasicDataSourceFactory.createDataSource(prop); } catch (Exception e) { e.printStackTrace(); } System.out.println("dataSource裝備成功"); return dataSource; } }

介面Condition

DataBaseConditional實現了Condition介面

public class DataBaseConditional implements Condition {
    /**
     * 資料庫裝配條件
     * @param context 條件上下文
     * @param metadata 註釋型別的元資料
     * @return true 裝配bean,否則不裝配
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        
        // 取出環境變數
        Environment env = context.getEnvironment();
        return env.containsProperty("test1.driverName") 
                && env.containsProperty("test1.url") 
                && env.containsProperty("test1.username")
                && env.containsProperty("test1.password");
    }
    
}

matche方法首先讀取其上下文,然後判定是否已經配置了對應的資料庫資訊,這樣的話當這些都已經配置好後則返回true。這時候Spring會裝配資料庫連線池的Bean,否則不裝配。