Spring Expression Language(SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。其语法与Unified EL类似,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。
虽然还有其他几种可用的Java表达式语言,如OGNL、MVEL、JBoss EL等,但Spring表达式语言的创建是为了向Spring社区提供单一支持的表达式语言,可以在所有Spring产品中使用SpEL。
SpEL的语言特性是由Spring项目中的需求驱动的,基于Eclipse的Spring Tool Suite中的代码自动完成。也就是说,SpEL基于一种与技术无关的API,允许在需要时集成其他表达式语言实现。
SpEL并不与Spring直接相关,可以独立使用。
SpEL表达式语言支持的功能除文本表达、布尔和关系运算符、正则表达式、类表达式,以及访问属性、数组、列表、Map外,还有调用方法、分配、调用构造函数、bean引用、数组构建、内联列表、内联Map、三元操作符、变量、用户定义的功能、集合投影、集合选择和模板化的表达式。
以下代码引入了SpEL API来评估文本字符串表达式“Hello World”。
消息变量的值只是简单的“Hello World”。使用的SpEL类和接口位于org.springframework.expression包及其子包(如spel.support)中。在这个例子中,表达式字符串是由单引号引起来的文本字符串,Expression接口负责评估表达式字符串。当分别调用parser.parseExpression和exp.getValue时,可能会抛出ParseException和EvaluationException两个异常。
SpEL支持很多功能,如调用方法、访问属性和调用构造函数。
1.调用方法
可以在字符串上调用concat方法,其示例为:
消息变量的值现在为“Hello World!”。
2.访问属性
可以调用String的Bytes属性,其示例为:
SpEL还支持使用标点符号的嵌套属性,其示例为:
3.调用构造函数
字符串的构造函数可以被调用,其示例为:
SpEL表达式可以与XML或基于注解的配置元数据一起使用来定义BeanDefinitions。在这两种情况下,定义表达式的语法形式都是#{<expression string>}。
1.基于XML的配置
可以使用以下表达式来设置属性或构造函数的参数值。
变量systemProperties是预定义的,所以可以在表达式中使用,如以下代码。
也可以通过名称引用其他bean属性,如以下代码。
2.基于注解的配置
@Value注解可以放在字段、方法及构造函数参数中,以指定默认值。
以下是一个设置字段变量默认值的例子。
以上示例等价于在属性的setter方法上设置默认值。
自动装配的方法和构造函数也可以使用@Value注解。
本小节使用SpEL来演示一个“商品费用结算”的例子,该例子通过SpEL表达式来筛选数据。
例子源码在expression-language目录下。
1.自定义领域对象
创建一个新类Item代表商品,其代码为:
创建一个新类ShopList代表商品清单,其代码为:
创建一个新类Tax代表商品税率,其代码为:
2.配置文件
定义Spring应用的配置文件spring.xml,这里的SpEL表达式是基于XML来定义的。
3.spel.properties文件
定义spel.properties,用于演示读取.properties文件的场景。
4.定义应用类Application
Application类定义如下。
5.运行应用
运行Application类,即可在控制台中看到如下信息。