Spring学习--Spring表达式语言(一)

标签:
spring投影spel详解表达式 |
分类: Spring学习 |
1. Spring的表达式语言概述
Spring表达式语言即Spring Expression
Language
,简称"SpEL";类似OGNL(Struts2中的表达式语言)表达式,它能够构建复杂的表达式,对象图形导航,对象方法调用等.并且能够与Spring的功能完美结合.
SpEL表达式给静态的Java代码添加了动态的功能.SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。
2. SpEL表达式的功能
最简单,最明显的就是该表达式的形式简单,可以减少我们的工作量.
3. SpEL表达式支持的表达式
1.
基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;
2.
类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;
3.
集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;
注意:SpEL表达式中不区分大小写.
小例子:
1.
基本概念:
1. 表达式:SpEL的核心就是表达式,所有SpEL都是围绕表达式来进行的;
2. 解析器:用于将字符串表达式解析为表达式对象;
3.
上下文:表达式所执行的环境,该环境可能定义变量、定义自定义函数、提供类型转换等等;(一般在Spring中几乎所有的Context都是与环境有关的);
4. 根对象是默认的活动上下文对象:活动上下文对象表示了当前表达式操作的对象;
2.
执行原理:
如图所示:
http://s12/mw690/003x41Zity6IN7gByJRdb&690
1. 创建一个表达式;
2. 创建解析器对象,SpELExpressionParser是默认的解析器对象的实现,
2.1.
进行词法分析,SpelExpressionParser解析器内部使用Tokenizer类进行词法分析,即把字符串流分析为记号流(内部实现);
2.2.进行表达式的语法分析,判断是否有语法错误,解析器便可根据记号流生成内部抽象语法树;在SpEL中语法树节点由SpelNode接口实现代表;
2.3. 创建Expression对象来封装内部实现;
3.
定义表达式上下文对象,也就是表达式的运行环境,SpEL提供默认实现StandardEvaluationContext;
4. 求值获取结果,使用表达式对象根据上下文对象求值(调用表达式对象的getValue方法)获得结果;
3. 接口详解
1. ExpressionParser接口
解析器类,默认实现:SpelExpressionParser类,它可以使用parserExpression方法将字符串表达式转为Expression对象,对于
ParserContext接口用于定义字符串表达式是不是模板,及模板开始与结束字符;
ExpressionParser代码:
public interface ExpressionParser {
Expression parseexpression_r(String
expressionString);
Expression
parseexpression_r(String expressionString, ParserContext
context);
}
小例子:
2. SpEL表达式的功能
3. SpEL表达式支持的表达式
package com.java.test;2. SpEL表达式的基本执行原理
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 ExpressionTest {
@Test
public void testexpression_r() {
ExpressionParser parser = new SpelExpressionParser();//创建SpEL解析器,而且SpelExpressionParser为默认实现
Expression e = parser.parseexpression_r("('Hello' + ' World').concat(#variable)");//创建表达式Expression对象
EvaluationContext context = new StandardEvaluationContex t();//构造上下文,比如:变量定义
context.setVariable("variable", "!");//设置变量的值
Assert.assertEquals("Hello World!", e.getValue(context));//求值,通过getValue获取指定的值
}
}
3. 接口详解
package com.java.test;
import org.junit.Test;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class ExpressionTest2 {
@Test
public void testexpression_r() {
ExpressionParser ep = new SpelExpressionParser();
ParserContext pc = new ParserContext() {
@Override
public boolean isTemplate() {
// 判断是否是模板
return true;
}
@Override
public String getExpressionPrefix() {
// 获取前缀
return "#{";