一 . 概述
在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") Classvalue = 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发挥取值的特性,完成一些特殊的任务.