1. 程式人生 > 實用技巧 >SpringBoot基礎篇Bean之條件注入@ConditionalOnExpression

SpringBoot基礎篇Bean之條件注入@ConditionalOnExpression

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,執行結果如下