IV. 表達式條件注入
相比較前面的Bean,Class是否存在,配置參數是否存在或者有某個值而言,這個依賴SPEL表達式的,就顯得更加的高級了;其主要就是執行Spel表達式,根據返回的true/false來判斷是否滿足條件
至於SPEL是什么東西,后面會有專文進行解釋,此處不加以展開。下面以一個簡單的demo進行演示它的使用姿勢
1. @ConditionalOnExpression
接口定義
@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.TYPE, ElementType.METHOD }) @Documented @Conditional(OnExpressionCondition.class) public @interface ConditionalOnExpression { /** * The SpEL expression to evaluate. Expression should return {@code true} if the * condition passes or {@code false} if it fails. * @return the SpEL expression */ String value() default "true"; }
2. 實例測試
用一個簡單的例子,當配置參數中,根據是否滿足某個條件來決定是否需要加載bean
a. 測試用例
定義一個滿足條件和一個不滿足的bean
public class ExpressFalseBean { private String name; public ExpressFalseBean(String name) { this.name = name; } public String getName() { return "express bean :" + name; } } public class ExpressTrueBean { private String name; public ExpressTrueBean(String name) { this.name = name; } public String getName() { return "express bean :" + name; } }
重點關注下bean的配置
@Configuration public class ExpressAutoConfig { /** * 當存在配置,且配置為true時才創建這個bean * @return */ @Bean @ConditionalOnExpression("#{'true'.equals(environment['conditional.express'])}") public ExpressTrueBean expressTrueBean() { return new ExpressTrueBean("express true"); } /** * 配置不存在,或配置的值不是true時,才創建bean * @return */ @Bean @ConditionalOnExpression("#{!'true'.equals(environment.getProperty('conditional.express'))}") public ExpressFalseBean expressFalseBean() { return new ExpressFalseBean("express != true"); } }
對應的配置如下
conditional.express=true
b. 實例演示
@RestController @RequestMapping(path = "express") public class ExpressRest { @Autowired(required = false) private ExpressTrueBean expressTrueBean; @Autowired(required = false) private ExpressFalseBean expressFalseBean; @GetMapping(path = "show") public String show() { Map<String, String> result = new HashMap<>(4); result.put("expressTrueBean", expressTrueBean == null ? "null ==> false" : expressTrueBean.getName()); result.put("expressFalseBean", expressFalseBean == null ? "null ==> true": expressFalseBean.getName()); return JSONObject.toJSONString(result); } }
上面的執行,expressTrueBean
應該存在,另外一個為null,運行結果如下