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

    1. ExpressionParser parser = new SpelExpressionParser();
    2. Expression exp = parser.parseExpression("'Hello World'");
    3. String message = (String) exp.getValue();
    最有可能使用的 SpEL 类和接口位于org.springframework.expression 包及其子包中,如 SpEL.support。
    支持方法调用:
    1. ExpressionParser parser = new SpelExpressionParser();
    2. Expression exp = parser.parseExpression("'Hello World'.concat('!')");
    3. String message = (String) exp.getValue();
    SpEL 更常见的用法是提供根据特定对象实例(称为根对象)计算的表达式字符串。 ```java // Create and set a calendar GregorianCalendar c = new GregorianCalendar(); c.set(1856, 7, 9);

// 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;
    }
}