专栏首页小灰灰SpringBoot基础篇Bean之条件注入@ConditionalOnExpression

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

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

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

<!-- more -->

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,运行结果如下

gif.gif

II. 其他

0. 相关

a. 更多博文

基础篇

应用篇

b. 项目源码

1. 一灰灰Blog

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

2. 声明

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

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

原文链接:http://spring.hhui.top/spring-blog/2018/10/19/181019-SpringBoot%E5%9F%BA%E7%A1%80%E7%AF%87Bean%E4%B9%8B%E6%9D%A1%E4%BB%B6%E6%B3%A8%E5%85%A5-ConditionalOnExpression/

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot基础篇Bean之动态注册

    以前也写过关于动态注册Bean的博文,如 180804-Spring之动态注册bean

    一灰灰blog
  • SpringBoot基础篇Bean之条件注入@ConditionalOnProperty

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

    一灰灰blog
  • SpringBoot基础篇Bean之自动加载

    通常来讲,要想实现上面的场景,建议是借助@Configuration注解的配置类来管理你自己的bean,这样对于其他使用方而言,只需要加载到你的配置类,就可以注...

    一灰灰blog
  • java8 Lambda尝尝鲜

    转载:猿天地 链接:http://cxytiandi.com/blog/detail/2196 java8都已经发布这么久了,一直没来得及使用,线上环境基本...

    猿天地
  • 简单介绍ASM核心API

    它的调用顺序是首先调用 visit,然后是对 visitSource 的最多一个调用,接下来是对 visitOuterClass 的最多一个调用,然后是可按任意...

    提莫队长
  • 设计模式之原型模式

    我们在创建对象时,通常是通过new关键字来创建的。但是,思考一下,如果当前类的构造函数很复杂,每次new对象时都会消耗非常多的资源,这样肯定是不行的,耗时又费力...

    烟雨星空
  • Java泛型学习

    1、泛型的概念     泛型即“参数化类型”,就比如我们定义方法的时候,定义一个变量,称为形参,变量值根据传进去的实参的值不同而改变。而泛型的出现,就是为了解决...

    JMCui
  • Spring Qualifier的使用

    spring 的 qualifier 平常使用一般直接是使用id 来限定,不过spring给我们提供了更强大的功能。

    Dylan Liu
  • 设计模式之简单工厂

    编写好之后,来看Main方法,当需要苹果时只需要修改一个参数就行了,并不需要在main方法中new,有小伙伴可能要问了,这代码没变少反而多了,关于这个问题请看设...

    tanoak
  • 呆呆的io流输入输出的一些基础

              关于io流的File类,下面来码一些基础属性:              文件的属性: 1 /* 2 public String...

    Gxjun

扫码关注云+社区

领取腾讯云代金券