语言参考
本节介绍 Spring 表达式语言的工作原理。
章节摘要
📄️ 字面量表达式
SpEL 支持以下类型的字面量表达式。
📄️ 属性、数组、列表、映射和索引器
Spring 表达式语言(Spring Expression Language)提供了对对象图导航和各种结构索引的支持。
📄️ 内联列表
你可以直接使用 {} 符号在表达式中表示列表。
📄️ 内嵌地图
你也可以直接在表达式中使用 {key:value} 表示法来表达映射。以下示例展示了如何做到这一点:
📄️ 数组构造
你可以使用熟悉的 Java 语法来构建数组,并可以选择提供一个初始化器,以便在构造时填充数组。以下示例展示了如何做到这一点:
📄️ 方法
你可以使用典型的 Java 编程语法来调用方法。你也可以直接在字符串或数字等字面量上调用方法。同时也支持可变参数(Varargs)。
📄️ 操作符
Spring 表达式语言支持以下类型的运算符:
📄️ 类型
你可以使用特殊的 T 操作符来指定一个 java.lang.Class 的实例(即类型)。静态方法也是通过使用此操作符来调用的。StandardEvaluationContext 使用 TypeLocator 来查找类型,而 StandardTypeLocator(可以被替换)在构建时已经理解了 java.lang 包。这意味着对 java.lang 包内的类型的 T() 引用不需要完全限定,但所有其他类型的引用必须完全限定。以下示例展示了如何使用 T 操作符:
📄️ 构造函数
你可以使用 new 操作符来调用构造函数。对于所有类型,除了位于 java.lang 包中的类型(如 Integer、Float、String 等),你应该使用完全限定的类名。Varargs(可变参数)也是支持的。
📄️ 变量
你可以通过在表达式中使用 #variableName 语法来引用变量。变量是通过在 EvaluationContext 实现中使用 setVariable() 方法设置的。
📄️ 函数
你可以通过注册用户自定义函数来扩展 SpEL,这些函数可以在表达式中使用 #functionName(…) 语法进行调用。与标准方法调用类似,函数调用也支持可变参数(varargs)。
📄️ 可变参数调用
Spring 表达式语言支持对构造函数、方法和用户定义函数进行可变参数调用。
📄️ Bean 引用
如果评估上下文已配置了 bean 解析器,你可以通过使用 @ 符号作为前缀从表达式中查找 bean。以下示例展示了如何执行此操作:
📄️ 三元运算符(If-Then-Else)
你可以使用三元运算符在表达式中执行 if-then-else 条件逻辑。以下清单展示了一个简单的示例:
📄️ Elvis 运算符
Elvis 操作符是三元操作符语法的简写形式,用于 Groovy 语言中。在使用三元操作符语法时,通常需要重复一个变量两次,如下例所示:
📄️ 安全导航运算符
安全导航操作符(?.)用于避免 NullPointerException,它源自 Groovy 语言。通常,当你有一个对象的引用时,你可能需要在访问该对象的方法或属性之前验证它是否为 null。为了避免这种情况,安全导航操作符会为特定的空安全操作返回 null,而不是抛出异常。
📄️ 集合选择
选择是一种强大的表达式语言特性,它允许你通过从源集合的条目中进行选择,将其转换为另一个集合。
📄️ 集合投影
投影(Projection)允许一个集合驱动子表达式的求值,结果是一个新的集合。投影的语法是 .!\[projectionExpression]。例如,假设我们有一个发明家的列表,但我们想要的是他们出生城市的列表。实际上,我们希望为发明家列表中的每一项求值 placeOfBirth.city。下面的示例使用投影来实现这一点:
📄️ 表达式模板化
表达式模板允许将字面文本与一个或多个求值块混合使用。每个求值块由前缀和后缀字符分隔,这些字符可以自定义。常见的选择是使用 #{ } 作为分隔符,如下例所示: