SpEl 表达式语法

文字表达

支持的文字表达式类型是字符串、数值(整数、实数、十六进制)、布尔值和空值。字符串由单引号分隔。要将单引号本身放在字符串中,请使用两个单引号字符。

ExpressionParser parser = new SpelExpressionParser();

// evals to "Hello World"
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();

double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();

// evals to 2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();

boolean trueValue = (Boolean) parser.parseExpression("true").getValue();

Object nullValue = parser.parseExpression("null").getValue();

Properties, Arrays, Lists, Maps, and Indexers

使用属性引用进行导航很容易。为此,请使用句点来指示嵌套的属性值

属性名称的第一个字母允许不区分大小写。因此,上面例子中的表达式可以分别写成Birthdate.Year + 1900PlaceOfBirth.City。此外,属性可以选择性地通过方法调用来访问——例如,getPlaceOfBirth().getCity()而不是 placeOfBirth.city.

数组和列表的内容使用方括号表示法获取,如下例所示:

map的内容是通过在括号内指定文字键值来获得的。在下面的例子中,因为officers映射的键是字符串,我们可以指定字符串文字:

Inline Lists

{}本身意味着一个空列表。出于性能原因,如果列表本身完全由固定文字组成,则会创建一个常量列表来表示表达式(而不是在每次评估时构建一个新列表)。

Map

您还可以使用{key:value}符号直接在表达式中表示映射

{:}本身就意味着一个空Map。出于性能原因,如果映射本身由固定文字或其他嵌套常量结构(列表或映射)组成,则会创建一个常量映射来表示表达式(而不是在每次评估时构建一个新映射)。映射键的引用是可选的(除非键包含句点 ( .))

数组构造

方法

您可以使用典型的 Java 编程语法来调用方法。您还可以对文字调用方法。还支持可变参数

关系运算符

使用标准运算符表示法支持关系运算符(等于、不等于、小于、小于或等于、大于和大于或等于)

大于和小于的比较null遵循一个简单的规则:null被视为无(即不是零)。因此,任何其他值总是大于nullX > null总是true)并且没有其他值永远小于没有(X < null总是false

每个符号运算符也可以指定为纯字母等效项。这避免了使用的符号对嵌入表达式的文档类型(例如在 XML 文档中)具有特殊含义的问题。

  • lt( <)

  • gt( >)

  • le( <=)

  • ge( >=)

  • eq( ==)

  • ne( !=)

  • div( /)

  • mod( %)

  • not( !)

逻辑运算符

SpEL 支持以下逻辑运算符:

  • and( &&)

  • or( ||)

  • not( !)

以下示例显示了如何使用逻辑运算符:

数学运算符

您可以+对数字和字符串使用加法运算符 ( )。您只能对数字使用减法 ( -)、乘法 ( *) 和除法 ( /) 运算符。您还可以对数字使用模数 ( %) 和指数幂 ( ^) 运算符。强制执行标准运算符优先级

赋值运算符

要设置属性,请使用赋值运算符 ( =)。这通常在对 的调用中完成,setValue但也可以在对 的调用中完成getValue

变量

您可以使用#variableName语法引用表达式中的变量

有效的变量名称必须由以下支持的一个或多个字符组成。

  • 字母:AZaz

  • 数字:09

  • 下划线: _

  • 美元符号: $

#this#root变量

#this变量总是被定义并且是指当前的评价对象(针对其不合格的引用解析)。该#root变量始终被定义并引用根上下文对象。尽管#this可能会随着表达式的组件的计算而变化,但#root始终指的是根。

Bean 引用

如果已使用 bean 解析器配置了评估上下文,则可以使用@符号从表达式中查找 bean

要访问工厂 bean 本身,您应该在 bean 名称前面加上一个&符号

三元运算符(If-Then-Else)

您可以使用三元运算符在表达式中执行 if-then-else 条件逻辑

在这种情况下,布尔值false会返回字符串 value 'falseExp'。一个更现实的例子如下:

表达式模板

表达式模板允许将文字文本与一个或多个评估块混合。每个评估块都用您可以定义的前缀和后缀字符分隔。一个常见的选择是#{ }用作分隔符,如以下示例所示:

字符串的计算方法是将文字文本'random number is '#{ }分隔符内的表达式的计算结果(在这种情况下,调用该random()方法的结果)连接起来。该parseExpression()方法的第二个参数的类型是ParserContext。该ParserContext接口用于影响表达式的解析方式,以支持表达式模板功能。定义TemplateParserContext如下:

Last updated