SpringBoot基础篇Bean之条件注入@ConditionalOnExpression

bean的条件注入,除了前面几篇博文分别介绍的通过@Conditional注解配合Condition接口的基本实现,以及如何使用条件注解@ConditionalOnBean@ConditionalOnClass和基于配置的@ConditionalOnProperty

本文介绍的注解将更加的灵活,基于SPEL表达式的条件注解ConditionalOnExpression

IV. 表达式条件注入

相比较前面的Bean,Class是否存在,配置参数是否存在或者有某个值而言,这个依赖SPEL表达式的,就显得更加的高级了;其主要就是执行Spel表达式,根据返回的true/false来判断是否满足条件

至于SPEL是什么东西,后面会有专文进行解释,此处不加以展开。下面以一个简单的demo进行演示它的使用姿势

1. @ConditionalOnExpression

接口定义

1
2
3
4
5
6
7
8
9
10
11
12
13
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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");
   }
}

对应的配置如下

1
conditional.express=true
b. 实例演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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,运行结果如下

II. 其他

0. 相关

a. 更多博文

基础篇

  • 181009-SpringBoot基础篇Bean之基本定义与使用

  • 181012-SpringBoot基础篇Bean之自动加载

  • 181013-SpringBoot基础篇Bean之动态注册

  • 181018-SpringBoot基础篇Bean之条件注入@Condition使用姿势

  • 181019-SpringBoot基础篇Bean之@ConditionalOnBean与@ConditionalOnClass

  • 181019-SpringBoot基础篇Bean之条件注入@ConditionalOnProperty

  • 181019-SpringBoot基础篇Bean之条件注入@ConditionalOnExpression

应用篇

  • 181017-SpringBoot应用篇Bean之注销与动态注册实现服务mock

b. 项目源码
  • 工程:spring-boot-demo

  • module: 007-conditionbean

1. 一灰灰Blog

  • 一灰灰Blog个人博客 https://blog.hhui.top

  • 一灰灰Blog-Spring专题博客 http://spring.hhui.top

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址: 小灰灰Blog

  • QQ: 一灰灰/3302797840

3. 扫描关注

一灰灰blog

知识星球

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一灰灰blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值