概述
Spring表达式语言(Spring Expression Language)缩写为“SpEL”,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能整合
SpEL是单独模块只依赖core模块,可单独使用
作用
- 基本表达式
字面量表达式、关系,逻辑与算数运算表达式、字符串连接、截取表达式、三目运算、Elibis表达式、正则表达式、括号优先级表达式; - 类相关表达式
类类型表达式、类实例化、instanceof表达式、变量定义引用、赋值表达式、自定义函数、对象属性存取、安全导航表达式、对象方法调用、bean引用; - 集合相关表达式
内联List、内联数组、集合、字典访问、列表字典数组修改、集合投影、集合选择’ - 其他表达式
模板表达式
注意:SpEL表达式中的关键字是不区分大小写的
Hello World
第一种
SpELHelloTest.java
package com.test;
import org.junit.Assert;
import org.junit.Test;
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;
public class SpELHelloTest {
@Test
public void SpELHelloTest(){
ExpressionParser parser=new SpelExpressionParser();
Expression expression=parser.parseExpression("('Hello'+' World').concat(#end)");
EvaluationContext context =new StandardEvaluationContext();
context.setVariable("end", "!");
Assert.assertTrue("Hello World!".equals(expression.getValue(context)));
}
}
步骤
1. 构造解析器
SpEL使用ExpressionParser接口表示解析器,提供了SpelExpressionParser实现
2. 解析器解析字符串表达式
使用ExpressionParser的parseExpression来解析相应的表达式为Expression对象
3. 构造上下文
准备变量定义等表达式需要的上下文数据
4. 根据上下文得到表达式运算后的值
通过Expression接口的getValue方法根据上下文获取表达式值
第二种
SpELHelloTest .java
package com.test;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class SpELHelloTest {
@Test
public void SpELHelloTest(){
ExpressionParser parser=new SpelExpressionParser();
//ParserContext 接口用于定义字符串是不是表达式以及模板的开始和结束字符
ParserContext parserContext=new ParserContext() {
//是否是模板
@Override
public boolean isTemplate() {
return true;
}
//结束字符
@Override
public String getExpressionSuffix() {
return "}";
}
//开始字符
@Override
public String getExpressionPrefix() {
return "#{";
}
};
String template="#{'Hello '}#{'World!'}";
//Expression expression=parser.parseExpression("('Hello'+' World').concat(#end)");
Expression expression=parser.parseExpression(template, parserContext);
//EvaluationContext context =new StandardEvaluationContext();
//context.setVariable("end", "!");
Assert.assertTrue("Hello World!".equals(expression.getValue()));
}
}
SpEL原理及接口
- 表达式:“做什么”
- 解析器:“谁来做”,将字符串表达式解析为表达式对象
- 上下文:“在哪做”,表达式对象的执行环境,该环境可能定义了变量、自定义函数、类型转换等
ExpressionParser.class
public abstract interface ExpressionParser
{
public abstract Expression parseExpression(String paramString)
throws ParseException;
public abstract Expression parseExpression(String paramString, ParserContext paramParserContext)
throws ParseException;
}
- ExpressionParser接口表示解析器,SpelExpressionParser为实现,其中ParserContext 接口用于定义字符串是不是表达式以及模板的开始和结束字符;
- EvaluationContext接口表示上下文环境,StandardEvaluationContext为实现,setRootObject设置跟对象,setVariable设置自定义变量,registerFunction注册自定义函数;
- Expression 接口表示表达式对象,getVlaue()取得表达式的值,setValue()设置表达式的值;