SpEL
是一种强大的表达式语言,支持在运行时查询和操作对象图。最显著的是方法调用和基本的字符串模板功能。
表达式语言支持以下功能:
- Literal expressions(文字表达式)
- Regular expressions
- Class expressions
- Accessing properties, arrays, lists, and maps
- Method invocation
- Relational operators
- Assignment(赋值)
- Calling constructors
- Bean references
- Array construction
- Inline lists
- Inline maps
- Ternary operator
- Variables
- User-defined functions
- Collection projection
- Collection selection
- Templated expressions
4.1 Evaluation
最有可能使用的 SpEL 类和接口位于ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'");
String message = (String) exp.getValue();
org.springframework.expression
包及其子包中,如 SpEL.support。
支持方法调用:
SpEL 更常见的用法是提供根据特定对象实例(称为根对象)计算的表达式字符串。 ```java // Create and set a calendar GregorianCalendar c = new GregorianCalendar(); c.set(1856, 7, 9);ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();
// The constructor arguments are name, birthday, and nationality. Inventor tesla = new Inventor(“Nikola Tesla”, c.getTime(), “Serbian”);
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(“name”); // Parse name as an expression String name = (String) exp.getValue(tesla); // name == “Nikola Tesla”
exp = parser.parseExpression(“name == ‘Nikola Tesla’”); boolean result = exp.getValue(tesla, Boolean.class); // result == true
<a name="ff080026"></a>
## 4.1.1. 理解`EvaluationContext`
计算表达式时使用 EvaluationContext 接口来解析属性、方法或字段,并帮助执行类型转换。Spring 提供了两种实现。
- `SimpleEvaluationContext`: 针对不需要完全使用 SpEL 语言语法并且应该受到有意义的限制的表达式类别,公开 SpEL 语言基本特性和配置选项的子集。示例包括但不限于数据绑定表达式和基于属性的筛选器。
- `StandardEvaluationContext`: 公开 SpEL 语言特性和配置选项的完整集合。您可以使用它来指定默认根对象,并配置每个可用的计算相关策略。
SimpleEvaluationContext 被设计成只支持 SpEL 语言语法的一个子集。它排除了 Java 类型引用、构造函数和 bean 引用。
<a name="Y4qSL"></a>
### 类型转换
ConversionService附带许多用于常规转换的内置转换器,但也是完全可扩展的,因此您可以添加类型之间的自定义转换。
```java
class Simple {
public List<Boolean> booleanList = new ArrayList<Boolean>();
}
Simple simple = new Simple();
simple.booleanList.add(true);
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
// "false" is passed in here as a String. SpEL and the conversion service
// will recognize that it needs to be a Boolean and convert it accordingly.
parser.parseExpression("booleanList[0]").setValue(context, simple, "false");
// b is false
Boolean b = simple.booleanList.get(0);
4.1.2 解析器配置
4.2 Expression in Bean Definition
<bean id="numberGuess" class="org.spring.samples.NumberGuess">
<property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
<!-- other properties -->
</bean>
4.2.2 注解配置
public class FieldValueTestBean {
@Value("#{ systemProperties['user.region'] }")
private String defaultLocale;
public void setDefaultLocale(String defaultLocale) {
this.defaultLocale = defaultLocale;
}
public String getDefaultLocale() {
return this.defaultLocale;
}
}