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发挥取值的特性,完成一些特殊的任务.

原文地址:https://www.cnblogs.com/trekxu/p/9094855.html