![](https://i-blog.csdnimg.cn/blog_migrate/9de54276245a0a8f64400992bd7ed60b.png)
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,运行结果如下
![](https://i-blog.csdnimg.cn/blog_migrate/babf15a8a3a09e6bd6eb4013da32469b.png)
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
应用篇
b. 项目源码
1. 一灰灰Blog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog
![](https://i-blog.csdnimg.cn/blog_migrate/630603eff662398b8a36008edbdbfba2.png)
知识星球
![](https://i-blog.csdnimg.cn/blog_migrate/352904ec0d6ab2511427e5969e64b6b3.png)