此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

可变参数调用

Spring 表达式语言支持对可变参数(varargs)的调用,适用于构造函数方法以及用户自定义的函数spring-doc.cadn.net.cn

以下示例展示了如何在表达式中调用 java.lang.String#formatted(Object…​)可变参数方法,通过将可变参数列表作为独立的参数('blue', 1)传入。spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted('blue', 1)";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted('blue', 1)"
val message = parser.parseExpression(expression).getValue(String::class.java)

变量参数列表也可以以数组形式提供,如下例所示(new Object[] {'blue', 1})。spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

作为替代方案,可以提供一个可变参数列表作为 java.util.List —— 例如,作为一个内联列表{'blue', 1})。以下示例展示了如何实现这一点。spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted({'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted({'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

可变参数类型转换

与 Java 中对可变参数(varargs)调用的标准支持不同, 在 SpEL 中调用可变参数构造函数、方法或函数时, 可能会对各个参数应用类型转换spring-doc.cadn.net.cn

例如,如果我们在 xref page 中注册了一个自定义 函数,其名称为 #reverseStrings,对应的方法签名为 String reverseStrings(String…​ strings),那么我们就可以在 SpEL 表达式中调用该函数,并传入任何可转换为 String 类型的参数,如下例所示。spring-doc.cadn.net.cn

// evaluates to "3.0, 2.0, 1, SpEL"
String expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)";
String message = parser.parseExpression(expression)
		.getValue(evaluationContext, String.class);
// evaluates to "3.0, 2.0, 1, SpEL"
val expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)"
val message = parser.parseExpression(expression)
		.getValue(evaluationContext, String::class.java)

同样,任何组件类型为所需可变参数类型子类型的数组,都可以作为可变参数调用的可变参数列表传入。例如,一个 String[] 数组可以传递给接受 Object…​ 参数列表的可变参数调用。spring-doc.cadn.net.cn

以下示例说明,我们可以向 String[]可变参数(varargs)方法传入一个 java.lang.String#formatted(Object…​) 数组。同时,该示例还强调了数值 1 会被自动转换为字符串 "1"spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)