Spring表达式语言(简称SpEL)是一种鱼JSP2 EL功能类似的变道时语言,它可以在运行时查询和操作对象图。与JSP 2的EL相比,SpEL功能更加强大,它甚至支持方法的调用和基本字符串模板。

  SpEL可以独立Spring容器使用——只是当初简单的表达式语言来使用;也可以在Annotation或XML配置中使用SpEL,这样可以充分利用SpEL简化Spring Bean的配置。

  Spring的SpEL可以单独使用,可以使用SpEL对表达式计算,求值。SpEL主要提供如下两个重要的接口。

  》ExpressionParser:该接口的实例负责解析一个SpEL表达式,返回一个Expression对象。

  》Expression: 该接口的实例代表一个表达式。

  Expression实例代表一个表达式,它包含了如下方法可用于计算,得到表达式的值。

  》Object getValue():计算表达式的值。

  》<T>T getValue(Class<T> desiredResultType):计算表达式的值,而且尝试将该表达式的值当成desiredResultType类型处理。

  》Object getValue(EvaluationContext context):使用指定的EvaluationContext来计算表达式的值

  》<T> T getValue(EvaluationContext context, Class<T> desiredResultType):使用指定EvaluationContext来计算表达式的值。而且尝试将该表达式的值当成desiredResultType类型处理

  》Object getValue(Object rootObject):以rootObject作为表达式的root对象来计算表达式的值。

  》<T> getValue(Object rootObject, Class<T> desiredResultType):以rootObject作为表达式的root对象来计算表达式的值。而且尝试将该表达式的值当成desiredResultType类型处理。

  下面的程序示范了如何利用ExpressionParser和Expression来计算表达式的值

 import org.springframework.expression.*;
import org.springframework.expression.spel.standard.*;
import org.springframework.expression.spel.support.*; import java.util.*; public class SpELTest
{
public static void main(String[] args)
{
//创建一个ExpressionParser对象,用于解析表达式
ExpressionParser parser = new SpelExpressionParser();
//最简单的字符串表达式
Expression exp = parser.parseExpression("'HelloWorld'");
System.out.println("'HelloWorld'的结果: " + exp.getValue());
//调用方法的表达式
exp = parser.parseExpression("'HelloWorld'.concat('!')");
System.out.println("'HelloWorld'.concat('!')的结果: "
+ exp.getValue());
//调用对象的getter方法
exp = parser.parseExpression("'HelloWorld'.bytes");
System.out.println("'HelloWorld'.bytes的结果: "
+ exp.getValue());
//访问对象的属性(d相当于HelloWorld.getBytes().length)
exp = parser.parseExpression("'HelloWorld'.bytes.length");
System.out.println("'HelloWorld'.bytes.length的结果:"
+ exp.getValue());
//使用构造器来创建对象
exp = parser.parseExpression("new String('helloworld')"
+ ".toUpperCase()");
System.out.println("new String('helloworld')"
+ ".toUpperCase()的结果是: "
+ exp.getValue(String.class)); Person person = new Person(1 , "孙悟空", new Date());
exp = parser.parseExpression("name");
//以指定对象作为root来计算表达式的值
//相当于调用person.name表达式的值
System.out.println("以persn为root,name表达式的值是: "
+ exp.getValue(person , String.class));
exp = parser.parseExpression("name=='孙悟空'");
StandardEvaluationContext ctx = new StandardEvaluationContext();
ctx.setRootObject(person);
//以指定Context来计算表达式的值
System.out.println(exp.getValue(ctx , Boolean.class)); List<Boolean> list = new ArrayList<Boolean>();
list.add(true);
EvaluationContext ctx2 = new StandardEvaluationContext();
//将list设置成EvaluationContext的一个变量
ctx2.setVariable("list" , list);
//修饰list变量的第一个元素的值
parser.parseExpression("#list[0]").setValue(ctx2 , "false");
//list集合的第一个元素被改变
System.out.println("list集合的第一个元素为: "
+ list.get(0));
}
}

  上面的程序使用了ExpressionParser多次解析了不同类型的表达式,ExpressionParser调用parserExpression()方法将会返回一个Expression实例(表达式对象)。程序调用Expression对象的getValue()方法即可获取该表达式的值。

  上面的程序还涉及一个EvaluationContext对象,它是SpEL计算表达式值的“上下文”对象,这个Context对象可以包含多个对象,但只能有一个root(跟)对象

  EvaluationContext有点类似于OGNL的Stack Context,EvaluationContext可以包含多个对象,但只能有一个root对象。

  为了往EvaluationContext里放入对象(SpEL称之为变量),可以调用该对象的如下方法。

  》setVariable(String name, Object value):向EvaluationContext中放入Value对象,该对象名为name

  为了在SpEL访问EvaluationContext中指定对象,应采用OGNL类似的格式

 #name

  StandardEvaluationContext提供了如下方法来设置root对象。

  》setRootObject(Object rootObject)

  在SpEL中访问root对象属性时,可以省略root对象前缀,例如如下代码:

 foo.bar    //访问rootObject的foo属性的bar属性

  当然是用Expression对象计算表达式时,也可以直接指定root对象,例如上面的程序中的代码:

 exp.getValue(person, String.class) //以person对象为root对象来计算表达式的值

SpEL快速入门的更多相关文章

  1. 【Java】Spring快速入门(一)

    Spring介绍 Spring可以轻松创建Java企业应用程序.它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并可根据应用程序的需要灵活地创建多 ...

  2. SpringSecurity快速入门

    作者:SingleXu 链接:https://www.jianshu.com/p/8212a559d633 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 简介 Sp ...

  3. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  4. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  5. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  6. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  9. grunt快速入门

    快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...

随机推荐

  1. GimageX

    {LJ?Dragon}[标题]GimageX 中文版备份恢复工具 如今由微软发布的免费系统部署软件 imageX 则更受到高手们的喜爱,被誉为系统备份/还原的必备新神器.imageX 不仅可用来封装制 ...

  2. JAVAEE filter总结

    1.  为什么需要filter? filter相当于客户端和服务器端之间的一扇门,就像保安一样.作用:比如说设置字符集和权限控制等等. 2.  细节; * . 只能对post请求起作用 *  .可以使 ...

  3. Android 网络框架---Volley

    /** * Volley 可以同时请求多个,允许高并发 * 特性: * 1.JSON.图片等的异步下载 * 2.网络请求的排序(Scheduling) * 3.网络请求的优先级处理 * 4.缓存 * ...

  4. C primer plus 读书笔记第十二章

    C的强大功能之一在于它允许我们控制程序的细节.C的内存管理系统正是这种控制能力的例子.它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制. 1.存储类及其说明符 主要的 ...

  5. 物联网MQTT协议分析和开源Mosquitto部署验证

    在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...

  6. Android中自定义View的MeasureSpec使用

    有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/guide/topics/ui/custo ...

  7. 浅析mysql 共享表空间与独享表空间以及他们之间的转化

        innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.什么是共享表空间和独占表空间共 ...

  8. 试答卓同学的 iOS 面试题

    卓同学昨天写了一篇文章<4道过滤菜鸟的iOS面试题>.我手痒决定默写一个参考答案.后来发现不认真回答被大家喷成狗,所以决定积极改造,重新做人.下面就是修编之后的答案. 1. struct和 ...

  9. js的new操作符

    1.创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型. 2.属性和方法被加入到 this 引用的对象中. 3.新创建的对象由 this 所引用,并且最后隐式的返回 this . ...

  10. lucene查询排序结果原理总结

    参考文章 Lucene3.0结果排序原理+操作+示例 Lucene的排序算法 一句话总结lucene排序算法是什么样的 关键几个概念 参考文档: http://lucene.apache.org/co ...