Spring表达式
Sprng表达式,可以适用于几乎所有的Spring产品中,是一种非常重要的表达式语言,下面我们一起来看看。
一、介绍
Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。
虽然还有其他几种Java表达式语言可用 - OGNL,MVEL和JBoss EL,仅举几例 - 创建Spring表达式语言是为了向Spring社区提供单一支持良好的表达式语言,可用于所有产品中组合。它的语言特性受到Spring产品组合中项目需求的驱动,包括基于Eclipse的Spring Tool Suite中代码完成支持的工具需求。也就是说,SpEL基于技术不可知的API,允许在需要时集成其他表达式语言实现。
虽然SpEL是Spring产品组合中表达式评估的基础,但它并不直接与Spring结合,可以独立使用。为了自成一体,本章中的许多示例都使用SpEL,就好像它是独立的表达式语言一样。这需要创建一些引导基础结构类,比如解析器。大多数Spring用户不需要处理这个基础设施,只需要创建表达式字符串进行评估。这种典型用法的一个例子是将SpEL集成到创建XML或基于注释的bean定义中,如定义bean定义的表达式支持部分所示。
本章介绍表达式语言,其API以及其语言语法的特性。在几个地方,一个Inventor和Inventor的Society类被用作表达式评估的目标对象。这些类声明和用于填充它们的数据在本章最后列出。
表达式语言支持以下功能:
- 文字表达
- 布尔和关系运算符
- 常用表达
- 类表达式
- 访问属性,数组,列表,地图
- 方法调用
- 关系运算符
- 分配
- 调用构造函数
- Bean引用
- 阵列构建
- 内联列表
- 内联地图
- 三元运营商
- 变量
- 用户定义的功能
- 集合投影
- 集合选择
- 模板化表达式
二、Evaluation
以下代码引入了SpEL API来评估文字字符串表达式“Hello World”。
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'");
String message = (String) exp.getValue();
消息变量的值只是’Hello World’。
您最有可能使用的SpEL类和接口位于程序包 org.springframework.expression及其子程序包(例如)中spel.support。
该接口ExpressionParser负责解析表达式字符串。在这个例子中,表达式字符串是由周围的单引号表示的字符串文字。该接口Expression负责评估以前定义的表达式字符串。有两个例外,可以被抛出,ParseException和EvaluationException在调用parser.parseExpression和exp.getValue 分别被抛出。
SpEL支持广泛的功能,例如调用方法,访问属性和调用构造函数。
作为方法调用的一个例子,我们concat在字符串文字上调用方法。
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();
现在输出的是:’Hello World!’。
作为调用JavaBean属性的示例,可以调用String属性Bytes,如下所示。
ExpressionParser parser = new SpelExpressionParser();
// invokes 'getBytes()'
Expression exp = parser.parseExpression("'Hello World'.bytes");
byte[] bytes = (byte[]) exp.getValue();
SpEL还支持使用标准点符号的嵌套属性,即 prop1.prop2.prop3属性值的设置
公共字段也可以被访问。
ExpressionParser parser = new SpelExpressionParser();
// invokes 'getBytes().length'
Expression exp = parser.parseExpression("'Hello World'.bytes.length");
int length = (Integer) exp.getValue();
可以调用String的构造函数,而不是使用字符串文字。
ExpressionParse