7.12 Spring提供的表达式语言(SpEL) 7.12.1 使用Expression接口进行表达式求值
7.12 Spring提供的表达式语言(SpEL)
Spring
表达式语言(简称SpEL)
是一种与JSP 2
的EL
功能类似的表达式语言,它可以在运行时查询和操作对象。与JSP 2
的EL
相比,SpEL
功能更加强大,它甚至支持方法调用和基本字符串模板函数。
SpEL
可以独立于Spring
容器使用——只是当成简单的表达式语言来使用;- 也可以在注解或
XMI
配置中使用SpEL
,这样可以充分利用SpEL
简化Spring
的Bean
配置
7.12.1 使用Expression接口进行表达式求值
Spring
的SpEL
可以单独使用,可以使用SpEL
对表达式计算、求值。
SpEL接口
SpEL
主要提供了如下三个接口。
接口 | 描述 |
---|---|
ExpressionParser |
该接口的实例负责解析一个SpEL 表达式,返回一个Expression 对象。 |
Expression |
该接口的实例代表一个表达式 |
EvaluationContext |
代表计算表达式值的上下文。当SpEL 表达式中含有变量时,程序将需要使用该API 来计算表达式的值。 |
Expression接口介绍
Expression
实例代表一个表达式,它包含了下面这些重载的getValue
方法用于计算表达式的值。
方法 | 描述 |
---|---|
Object getValue() |
计算表达式的值。 |
<T> T getValue(Class<T> desiredResultType) |
计算表达式的值,而且尝试将该表达式的值当成desiredResultType 类型处理。 |
Object getValue(Evaluation ContextContext) |
使用指定的EvaluationContext 来计算表达式的值。 |
<T> T getValue(Evaluation ContextContext, Class<T> desiredResultType) |
使用指定的EvaluationContext 来计算表达式的值,而且尝试将该表达式的值当成desiredResultType 类型处理. |
Object getValue(Object rootObject) |
以rootObject 作为表达式的root 对象来计算表达式的值。 |
<T> T getValue(Object rootObject,Class<T> desiredResultType) |
以rootObject 作为表达式的root 对象来计算表达式的值,而且尝试将该表达式的值当成desiredResultType 类型处理。 |
程序示例
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\Expression\src |
SpELTest.java
下面的程序示范了如何利用ExpressionParser
和Expression
来计算表达式的值
1 | package lee; |
上面程序中的代码使用ExpressionParser
多次解析了不同类型的表达式,
ExpressionParser
调用parseExpression
方法将返回一个Expression
实例(表达式对象)。- 调用
Expression
对象的getValue
方法即可获取该表达式的值。
EvaluationContext
代表SpEL
计算表达式值的”上下文”,这个Context
对象可以包含多个对象,但只能有一个root
(根)对象。EvaluationContext
的作用有点类似于前面介绍的OGNL
中的StackContext
,EvaluationContext
可以包含多个对象,但只能有一个root
对象。当表达式中包含变量时,SpEL
就会根据EvaluationContext
中变量的值对表达式进行计算。
往EvaluationContext里面放入变量
为了往EvaluationContext
里放入对象(SpEL
称之为变量),可以调用该对象的如下方法:setVariable(String name,Object value)
:向EvaluationContext
中放入value
对象,该对象名为name
为了在SpEL
访问Evaluation context
中指定对象,应采用与OGNL
类似的格式:
1 | #name |
StandardEvaluationContext设置root对象
StandardEvaluationContext
提供了setRootObject(Object rootObject)
法来设置root
对象。
在SpEL
中访问root
对象的属性时,可以省略root
对象前缀,例如如下代码:
1 | foo.bar //访问 rootObject的foo属性的bar属性 |
当然,使用Expression
对象计算表达式的值时,也可以直接指定root
对象,例如上面程序中的粗体字代码:
1 | exp.getValue(person, String.class) //以`person`对象为`root`对象计算表达式的值 |
Person.java
上面的程序中使用了一个简单的Person
类,它只是一个普通的Java Bean
:
1 | package org.crazyit.app.domain; |