从零开始 Spring Boot 31:Spring 表达式语言
Spring表达式语言(Spring Expression Language,简称 “SpEL”)是一种强大的表达式语言,支持在运行时查询和操作对象图。该语言的语法与统一EL相似,但提供了额外的功能,最显著的是方法调用和基本的字符串模板功能。
评估
直接看一个简单示例:
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'");
String value = (String) expression.getValue();
System.out.println(value);
SpelExpressionParser
是一个Spel表达式解析器,主要实现了ExpressionParser
接口:
package org.springframework.expression;
public interface ExpressionParser {
Expression parseExpression(String expressionString) throws ParseException;
Expression parseExpression(String expressionString, ParserContext context) throws ParseException;
}
org.springframework.expression
是Spring中SpEL相关功能的包。
ExpressionParser.parseExpression()
可以解析SpEL表达式并返回一个Expression
对象。这里的'Hello World'
是一个简单的字面量,所以最后的输出的是:
Hello World
Expression.getValue()
方法可以获取表达式“评估”(Evaluation)后的值,这个值的类型是Object
,需要进行转换。
如果评估失败,会抛出一个EvaluationException
异常:
public interface Expression {
@Nullable
Object getValue() throws EvaluationException;
// ...
}
在SpEL中,还可以调用方法:
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'.concat('!')");
String value = expression.getValue(String.class);
System.out.println(value);
这里调用了String.concat()
方法进行字符串连接,最后的输出是:
Hello World!
此外,示例中使用了一个泛型版本的getValue()
方法,通过传入一个目标类型的Class
对象,可以直接获取相应类型的结果,不用进行强制类型转换。
类似的,SpEL中也可以使用对象属性:
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'.bytes");
byte[] bytes = (byte[]) expression.getValue();
System.out.println(Arrays.toString(bytes));
输出结果:
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
对属性也可以用.
进行级联操作:
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Hello World'.bytes.length");
Integer value = (Integer) expression.getValue();
System.out.println(value);