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

  • 相关阅读:
    记录移动端原生开发基础样式
    windows关闭打开应用的时候的安全弹窗
    thinkPad触控板手势安装
    git修改账号密码
    ssh免密登录失效处理
    xxl-rpc remoting error(Connection refused (Connection refused)), for url : http://xxxxxx:19997/run
    utools好用插件分享
    Android Studio打包apk闪退处理
    maven下载jar包失败处理
    微信文件下载位置
  • 原文地址:https://www.cnblogs.com/lgjava/p/13920375.html
Copyright © 2020-2023  润新知