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