015 spel

Posted 最爱五仁月饼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了015 spel相关的知识,希望对你有一定的参考价值。

一 . 概述

  在spring3.x之中提出了spel的方式,其目的就是在静态语言之中增加动态语言的能力.

实际上我们可以和IOC容器实现一些特别的功能.


 二 . 简单的演示

@Test
    public void test() {
        //创建一个spel的表达式解析器
        ExpressionParser parser = new SpelExpressionParser();
        //解析一个表达式,返回一个表达式对象
        Expression expression = parser.parseExpression("1 + 1");
        //添加执行上下文
        EvaluationContext context = new StandardEvaluationContext();
        //获取结果
        Object value = expression.getValue(context);
        System.out.println(value);
    }    

三 . 介绍

我们在这里不对spel的基本语法进行一些列的介绍,因为这个根本没有意思.

  我们最感兴趣还是对反射的支持.  

    @Test
    public void test() throws Exception {
        //创建一个spel的表达式解析器
        ExpressionParser parser = new SpelExpressionParser();
        //解析一个表达式,返回一个表达式对象
        Expression expression = parser.parseExpression("T(java.util.Date)");
        //添加执行上下文
        EvaluationContext context = new StandardEvaluationContext();
        //获取结果
        @SuppressWarnings("unchecked")
        Class<Date> value = expression.getValue(context,Class.class);
        Date date = value.newInstance();
        System.out.println(date);
    }

在这里我们使用了T(字符串形式的全类名),就可以获得到了Class字节码对象.

另外一个问题,就是我们是否可以支持获取对象的属性,就像ognl那样的方式.

  在spel之中使用#标示从根对象之中获取.

@Test
    public void test() throws Exception {
        User user = new User();
        user.setAge("12");
        user.setName("trek");
        
        //创建一个spel的表达式解析器
        ExpressionParser parser = new SpelExpressionParser();
        //解析一个表达式,返回一个表达式对象
        Expression expression = parser.parseExpression("#user.name");
        //添加执行上下文
        EvaluationContext context = new StandardEvaluationContext();
        context.setVariable("user", user);
        //获取结果
        System.out.println(expression.getValue(context));
    }    

现在我们就可以实现了ognl表达式那么的功能了.


 四 .总结

  spel的功能很强大,但是我们实际的使用过程中如果不封装一下的话,那么使用就会非常的痛苦,毕竟不是所有的人都会使用.

  一般情况下,我们可以通过注解的方式配合spel发挥取值的特性,完成一些特殊的任务.

以上是关于015 spel的主要内容,如果未能解决你的问题,请参考以下文章

web安全Spel表达式注入漏洞

spring in action 学习笔记十三:SpEL语言(Spring Expression Language)

015 CONTEXT 线程安全上锁 代码实现

基于SpEL在Spring Cloud Gateway中实现全维度灰度路由

如何在Spring YAML配置中逃避SpEL美元符号?

Thymeleaf 和 Spring Security - 自定义 SpEL 表达式