SpEL快速入门
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快速入门的更多相关文章
- 【Java】Spring快速入门(一)
Spring介绍 Spring可以轻松创建Java企业应用程序.它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并可根据应用程序的需要灵活地创建多 ...
- SpringSecurity快速入门
作者:SingleXu 链接:https://www.jianshu.com/p/8212a559d633 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 简介 Sp ...
- Web Api 入门实战 (快速入门+工具使用+不依赖IIS)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)
今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- Mybatis框架 的快速入门
MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...
- grunt快速入门
快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...
随机推荐
- Selenium webdriver firefox 路径设置问题
问题: Cannot find firefox binary in PATH. Make sure firefox is installed. 原因:selenium找不到Firefox浏览器. 方法 ...
- OpenRisc-43-or1200的IF模块分析
引言 “喂饱饥饿的CPU”,是计算机体系结构设计者时刻要考虑的问题.要解决这个问题,方法大体可分为两部分,第一就是利用principle of locality而引进的cache技术,缩短取指时间,第 ...
- 423. Reconstruct Original Digits from English
这个题做得突出一个蠢字.. 思路就是看unique letter,因为题里说肯定是valid string.. 一开始有几个Z就有几个ZERO 同样的还有x for six, g for eight, ...
- 10个经典的Java面试题
这里有10个经典的Java面试题,也为大家列出了答案.这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高.让我们一起来看看吧. 1.Java的HashMap是如何工作的? ...
- Windows7下32位IE异常不能打开解决方法
今天更新了Update及安装了一些软件,重启电脑后发现32位IE不能正常打开,而64位IE正常. 错误信息如下: 问题签名: 问题事件名称: BEX 应用程序名: iexplore.exe 应用 ...
- java參数传递机制浅析
欢迎转载,转载请声明出处! ----------------------------------------- 前言: java语言中,參数的传递仅仅有一种机制.那就是值传递. 举例: 以下将通过几个 ...
- 寻找大学目标及行动步骤——记ITAEM团队第二期宣讲会(2014.05.14)
·昨晚8:00-9:40.在 钟海楼03029 ,进行了ITAEM团队第二期宣讲会(第一期见第一期宣讲会总结).来參加的主要是大一学生.以信院为主.也有法学院.文学院的同学. 在宣讲会中,大家都比較积 ...
- 用Lighttpd做图片服务器
http://www.lsanotes.cn/install_lighttpd 用Lighttpd做图片服务器 一.安装lighttpd所需的库文件1.安装 pcrewgetftp://ftp.csx ...
- PHP Ctype函数(转)
Ctype函数是PHP内置的字符串体测函数.主要有以下几种 ctype_alnum -- Check for alphanumeric character(s)检测是否是只包含[A-Za-z0-9] ...
- raknet unity3d
Raknet是一高性能的跨平台的网络库. 他主要基于UDP实现,性能非常好,能够做server. 鉴于unity3d较差的网络支持. 本人成功实现了raknet c# for unity3d的使用,s ...