美文网首页
spel的用法

spel的用法

作者: 饱饱想要灵感 | 来源:发表于2022-06-28 20:25 被阅读0次

    SpEL即Spring Expression Language, Spring表达式语言, 能够在运行时构建复杂的表达式, 读写对象属性, 调用对象方法等等,与Spring完美契合. 赋予了Java动态功能, 利用其动态特性, 可以实现审批流等等

    用法一 传递变量

        @Test
        public void spelBaseTest() {
            // 1.创建表达式解析器
            ExpressionParser parser = new SpelExpressionParser();
            // 2.执行表达式,取得表达式结果
            String expressionStr = "'Hello, Spel' + #ending + '\n' + " +
                    "'Fighting, ' + #mobileMap['huawei'] + #ending + '\n' + " +
                    "'Fly, ' + #collectCar[0] + #ending + '\n' + " +
                    "'欧力给, ' + #user.name + #ending + '\n' + " +
                    " new String(#number matches '\\d+')";
            Expression expression = parser.parseExpression(expressionStr);
    
            // 3.创建变量上下文,设置变量
            EvaluationContext evaluationContext = new StandardEvaluationContext();
            // 变量1,普通字符串
            evaluationContext.setVariable("ending", "!");
            // 变量2,Map类型
            Map<String, String> mobileMap = Maps.newHashMap();
            mobileMap.put("huawei", "华为");
            mobileMap.put("xiaomi", "小米");
            evaluationContext.setVariable("mobileMap", mobileMap);
            // 变量3,Collection类型
            evaluationContext.setVariable("collectCar", Lists.newArrayList("比亚迪", "红旗", "吉利"));
            // 变量4,POJO对象
            evaluationContext.setVariable("user", new User("饱饱"));
            // 变量5,匹配正则表达式
            evaluationContext.setVariable("number", 142857);
    
            // 4.传入变量上下文,通过表达式对象取得结果
            String result = expression.getValue(evaluationContext, String.class);
            System.out.println(result);
        }
    

    用法二 修改变量值

     @Test
     public void spelSetValueTest() {
         // 1. 设置变量
         Car car = new Car("比亚迪");
         StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
         standardEvaluationContext.setVariable("car", car);
         // 2. 创建解析器
         ExpressionParser expressionParser = new SpelExpressionParser();
    
         // 3. 执行表达式,取得表达式结果
         String carExpressionStr = "#car.name";
         Expression carExpression = expressionParser.parseExpression(carExpressionStr);
    
         // 4. 修改变量值
         String nowValue = carExpression.getValue(standardEvaluationContext, String.class);
         carExpression.setValue(standardEvaluationContext, nowValue + "-海豹");
         System.out.println(car.getName());
     }
    

    用法三 调用Component的方法

        @Test
        public void beanFactoryResolverTest() {
            // 0. 此处用DefaultListableBeanFactory做测试,系统运行时可传入ApplicationContext
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            User user = new User("饱饱");
            beanFactory.registerSingleton("user", user);
            System.out.println(beanFactory.getBean("user"));
    
            // 1. 设置bean解析器
            StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
            standardEvaluationContext.setBeanResolver(new BeanFactoryResolver(beanFactory));
    
            // 2. 设置spel解析器
            ExpressionParser expressionParser = new SpelExpressionParser();
    
            // 3. spel解析器执行表达式取得结果
            String dreamExpressionStr = "@user.dream()";
            String result = expressionParser.parseExpression(dreamExpressionStr).getValue(standardEvaluationContext, String.class);
            System.out.println(result);
        }
    

    还有其它运算, 如算术运算、逻辑运算、比较运算、类实例化、instanceof、内联List、内联数组、集合投影、集合选择......, 不一一列举

    相关文章

      网友评论

          本文标题:spel的用法

          本文链接:https://www.haomeiwen.com/subject/ljrxbrtx.html