版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/andy_zhang2007/article/details/84947114
例子源代码
package tut.zero;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
/**
* SpEL 基础用法示例
*/
public class SpELPrimeUseTest {
public static void main(String[] args) {
// 1. 提供待评估(求值)的表达式字符串
String expressionString = "('Hello' + ' World').concat(#end)";
// 2. 指定将要使用的表达式分析器
ExpressionParser parser = new SpelExpressionParser();
// 3. 分析表达式字符串
Expression expression = parser.parseExpression(expressionString);
// 4. 构建表达式评估(求值)上下文环境,也需要指定环境中相关的变量
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("end", "!");
// 5. 指定要将表达式评估(求值)结果对象转换成的目标类型,
// 这个例子中使用了字符串
Class<String> desiredResultType = String.class;
// 6. 表达式评估(求值)并转换成指定类型
String value = expression.getValue(context, desiredResultType);
// 输出最终结果
System.out.println("Result value is : " + value);
}
}
基础使用步骤介绍
上面例子演示的使用方法和步骤虽然简单,但却是最基本的,不管是Spring framework
的内部使用,如@Value
最终的SpEL
解析,还是开发人员使用,都逃不开此基本流程。所以这里做一总结梳理以备参考。
1. 提供待评估(求值)的表达式字符串
例子 :
String expressionString = "('Hello' + ' World').concat(#end)";
该例子直接给出了一个简单的表达式字符串,实际应用中,包括在Spring framework
内部使用的时候,表达式字符串可能来自很多渠道,也可能很复杂,甚至包含对bean
的引用。但是不管怎样,要交给表达式解析器的,都最终会是一个表达式字符串。
2. 指定将要使用的表达式分析器
例子 :
ExpressionParser parser = new SpelExpressionParser();
3. 分析表达式字符串
例子 :
Expression expression = parser.parseExpression(expressionString);
解析所提供的表达式字符串,如果解析遇到问题,抛出异常ParseException
。如果成功返回一个Expression
对象供随后求值评估使用。
4. 构建表达式评估(求值)上下文环境,也需要指定环境中相关的变量
例子 :
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("end", "!");
这里使用了一个StandardEvaluationContext
作为评估/求值上面例子表达式的EvaluationContext
评估上下文。StandardEvaluationContext
是一个功能强大,可以高度配置的EvaluationContext
,它基于反射解析属性,方法和成员字段。
而对于简单一些的求值/评估,可以使用一个较为简单的EvaluationContext
:SimpleEvaluationContext
。它的求值/评估能力是SpEL功能的一个子集,主要用于一些数据绑定场景的条件求值。比如它不支持包含Java类型,
构造函数和bean引用的表达式。
5. 指定要将表达式评估(求值)结果对象转换成的目标类型
例子 :
// 这个例子中使用了字符串
Class<String> desiredResultType = String.class;
也可以不指定目标类型,如果不指定,结果会是Object
类型。
6. 表达式评估(求值)并转换成指定类型
例子 :
String value = expression.getValue(context, desiredResultType);