1. 程式人生 > 程式設計 >Spring基於@Conditional條件化裝配bean

Spring基於@Conditional條件化裝配bean

一 前言

理解spring的如何根據條件裝配bean有助於我們更好使用springboot進行開發,和原始碼理解;

@Conditional 裝配bean

思路如下

Spring中提供了@Conditional註解實現條件化是否裝配bean,這樣可以根據條件動態的裝配bean;

要判定@Conditional 註解是否該裝配bean還需要Condition 介面配合,我們只須實現 Condition 介面,重寫matches 方法;

根據matches方法返回的布林值進行判定@Conditional是否需要裝配bean

實現過程如下

2.1 使用者類

使用者類用於配置類是否裝配該Bean

/**
 * @Author lsc
 * <p> </p>
 */
public class User {

  private String userName;

	// 省略 set get
}

2.2 Condition實現類

RuntimeExist 實現 Condition ,使用 conditionContext 獲取jvm 環境變數,如果存在則返回 true,否則返回false;其中conditionContext還有如下方法

  • getRegistry():使用BeanDefinitionRegistry的檢查bean定義;
  • getBeanFactory():使用ConfigurableListableBeanFactory檢查bean是否存在;
  • getEnvironment():Environment環境變數
  • getResourceLoader():ResourceLoader載入的資源;
  • getClassLoader():ClassLoader載入的類。
public class RuntimeExist implements Condition {
  public boolean matches(ConditionContext conditionContext,AnnotatedTypeMetadata annotatedTypeMetadata) {
    // 獲取jvm 執行時環境
    Environment environment = conditionContext.getEnvironment();
    // 檢查 jvm 執行時環境是否存在屬性
    return environment.containsProperty("java.runtime.name");
  }
}

2.3 使用者配置類

根據 RuntimeExist的 matches 方法的返回值 是否裝配bean; 這邊設定了屬性名稱 zszxz,以便於更好的測試;

/**
 * @Author lsc
 * <p> </p>
 */
@Configuration
public class UserConfig {

  @Bean
  // 根據 RuntimeExist的 matches 方法的返回值 是否裝配bean
  @Conditional(RuntimeExist.class)
  public User user(){
    User user = new User();
    user.setUserName("zszxz");
    return user;
  }
}

2.4 測試

由於 jvm 執行時環境存在 java.runtime.name 屬性 ,故會裝配成功,會打印出 zszxz ;

如果將 java.runtime.name 改為 任意jvm 執行時不存在的屬性 ,測試就會報異常;

@RunWith(SpringJUnit4ClassRunner.class)//建立spring應用上下文
@ContextConfiguration(classes= UserConfig.class)//載入配置類
public class ConditionTest {

  @Autowired
  User user;

  @Test
  public void test(){
    // zszxz
    System.out.println(user.getUserName());
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。