`
高级java工程师
  • 浏览: 396074 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3

 
阅读更多

 

 

5.1  概述

5.1.1  概述

       Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。

       表达式语言给静态Java语言增加了动态功能。

       SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。

5.1.2  能干什么

       表达式语言一般是用最简单的形式完成最主要的工作,减少我们的工作量。

       SpEL支持如下表达式:

一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;

二、类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;

三、集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;

四、其他表达式:模板表达式。

注:SpEL表达式中的关键字是不区分大小写的。

5.2  SpEL基础

5.2.1  HelloWorld

       首先准备支持SpEL的Jar包:“org.springframework.expression-3.0.5.RELEASE.jar”将其添加到类路径中。

       SpEL在求表达式值时一般分为四步,其中第三步可选:首先构造一个解析器,其次解析器解析字符串表达式,在此构造上下文,最后根据上下文得到表达式运算后的值。

       让我们看下代码片段吧:

 

 

java代码:
Java代码  收藏代码
  1. package cn.javass.spring.chapter5;  
  2. import junit.framework.Assert;  
  3. import org.junit.Test;  
  4. import org.springframework.expression.EvaluationContext;  
  5. import org.springframework.expression.Expression;  
  6. import org.springframework.expression.ExpressionParser;  
  7. import org.springframework.expression.spel.standard.SpelExpressionParser;  
  8. import org.springframework.expression.spel.support.StandardEvaluationContext;  
  9. public class SpELTest {  
  10.     @Test  
  11.     public void helloWorld() {  
  12.         ExpressionParser parser = new SpelExpressionParser();  
  13.         Expression expression =  
  14. parser.parseExpression("('Hello' + ' World').concat(#end)");  
  15.         EvaluationContext context = new StandardEvaluationContext();  
  16.         context.setVariable("end""!");  
  17.         Assert.assertEquals("Hello World!", expression.getValue(context));  
  18.     }  
  19. }  

 

接下来让我们分析下代码:

1)创建解析器:SpEL使用ExpressionParser接口表示解析器,提供SpelExpressionParser默认实现;

2)解析表达式:使用ExpressionParser的parseExpression来解析相应的表达式为Expression对象。

3)构造上下文:准备比如变量定义等等表达式需要的上下文数据。

4)求值:通过Expression接口的getValue方法根据上下文获得表达式值。

 

是不是很简单,接下来让我们看下其具体实现及原理吧。

5.2.3  SpEL原理及接口

       SpEL提供简单的接口从而简化用户使用,在介绍原理前让我们学习下几个概念:

       一、表达式:表达式是表达式语言的核心,所以表达式语言都是围绕表达式进行的,从我们角度来看是“干什么”;

       二、解析器:用于将字符串表达式解析为表达式对象,从我们角度来看是“谁来干”;

       三、上下文:表达式对象执行的环境,该环境可能定义变量、定义自定义函数、提供类型转换等等,从我们角度看是“在哪干”;

       四、根对象及活动上下文对象:根对象是默认的活动上下文对象,活动上下文对象表示了当前表达式操作的对象,从我们角度看是“对谁干”。

       理解了这些概念后,让我们看下SpEL如何工作的呢,如图5-1所示:

 

图5-1 工作原理

       1)首先定义表达式:“1+2”;

       2)定义解析器ExpressionParser实现,SpEL提供默认实现SpelExpressionParser;

       2.1)SpelExpressionParser解析器内部使用Tokenizer类进行词法分析,即把字符串流分析为记号流,记号在SpEL使用Token类来表示;

       2.2)有了记号流后,解析器便可根据记号流生成内部抽象语法树;在SpEL中语法树节点由SpelNode接口实现代表:如OpPlus表示加操作节点、IntLiteral表示int型字面量节点;使用SpelNodel实现组成了抽象语法树;

       2.3)对外提供Expression接口来简化表示抽象语法树,从而隐藏内部实现细节,并提供getValue简单方法用于获取表达式值;SpEL提供默认实现为SpelExpression;

       3)定义表达式上下文对象(可选),SpEL使用EvaluationContext接口表示上下文对象,用于设置根对象、自定义变量、自定义函数、类型转换器等,SpEL提供默认实现StandardEvaluationContext;

4)使用表达式对象根据上下文对象(可选)求值(调用表达式对象的getValue方法)获得结果。

接下来让我们看下SpEL的主要接口吧:

1)ExpressionParser接口:表示解析器,默认实现是org.springframework.expression.spel.standard包中的SpelExpressionParser类,使用parseExpression方法将字符串表达式转换为Expression对象,对于ParserContext接口用于定义字符串表达式是不是模板,及模板开始与结束字符:

 

java代码:
Java代码  
  1. public interface ExpressionParser {  
  2.        Expression parseExpression(String expressionString);  
  3.        Expression parseExpression(String expressionString, ParserContext context);  
  4. }  

 

 

来看下示例:

 

java代码:
Java代码  
  1.       
  2. @Test  
  3. public void testParserContext() {  
  4.     ExpressionParser parser = new SpelExpressionParser();  
  5.     ParserContext parserContext = new ParserContext() {  
  6.         @Override  
  7.          public boolean isTemplate() {  
  8.             return true;  
  9.         }  
  10.         @Override  
  11.         public String getExpressionPrefix() {  
  12.             return "#{";  
  13.         }  
  14.         @Override  
  15.         public String getExpressionSuffix() {  
  16.             return "}";  
  17.         }  
  18.     };  
  19.     String template = "#{'Hello '}#{'World!'}";  
  20.     Expression expression = parser.parseExpression(template, parserContext);  
  21.     Assert.assertEquals("Hello World!", expression.getValue());  
  22. }  

 

 

在此我们演示的是使用ParserContext的情况,此处定义了ParserContext实现:定义表达式是模块,表达式前缀为“#{”,后缀为“}”;使用parseExpression解析时传入的模板必须以“#{”开头,以“}”结尾,如"#{'Hello '}#{'World!'}"。

默认传入的字符串表达式不是模板形式,如之前演示的Hello World。

 

2)EvaluationContext接口:表示上下文环境,默认实现是org.springframework.expression.spel.support包中的StandardEvaluationContext类,使用setRootObject方法来设置根对象,使用setVariable方法来注册自定义变量,使用registerFunction来注册自定义函数等等。

 

3)Expression接口:表示表达式对象,默认实现是org.springframework.expression.spel.standard包中的SpelExpression,提供getValue方法用于获取表达式值,提供setValue方法用于设置对象值。

了解了SpEL原理及接口,接下来的事情就是SpEL语法了。

 

分享到:
评论

相关推荐

    跟我学spring3(1-7)

    【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3 【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3 【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3 ...

    跟开涛学Spring

    1.15 【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3 . . . . . . . . . . . . . . .177 1.16 【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3 . . . . . . . . . . . . ....

    跟我学spring3(1-7).pdf

    Spring概述2.1 IoC基础2.2 IoC 容器基本原理2.3 IoC的配置使用——跟我学Spring33.1 DI的配置使用3.2 循环依赖3.3 更多DI的知识 3.4 Bean的作用域 4.1 基础知识4.2 内置Resource实现4.3 访问Resource4.4 Resource...

    Spring表达式语言中文参考手册.docx

    Spring Expression Language (SpEL)中文文档。基于Spring4.x。

    spring spEL 表达式详解

    spring spEL 表达式详解 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖

    Spring_SpEl表达式使用用例

    Spring_SpEl表达式使用用例 只是一个简单的demo,有需要的可以看看

    基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志框架+源代码+文档说明

    基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志 ### 简介 * 使用annotation来标注方法,标记操作内容 * 使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息) * ...

    Spring表达式语言SpEL用法详解

    主要介绍了spring表达式语言SpEL用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    opt-log:基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志框架

    opt-log基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志简介使用annotation来标注方法,标记操作内容使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息)同一个...

    Spring实战之Bean定义中的SpEL表达式语言支持操作示例

    主要介绍了Spring实战之Bean定义中的SpEL表达式语言支持操作,结合实例形式分析了Bean定义中的SpEL表达式语言操作步骤与实现技巧,需要的朋友可以参考下

    Spring 3.0-API 参考手册

    Spring 3.0中,新的表达式语言名叫Spring Expression Language(SpEL,直译就是Spring表达式语言)。Shaun将其描述为“嵌入在Spring编程模型上的,可以用来在Spring项目之间描述任务以及配置的微型脚本语言。SpEL...

    SSH笔记-SpEL

    SSH笔记-Spring表达式语言:SpEL,关于SpEl的字面量、引用 Bean、属性和方法、支持的运算符号

    spring-framework-reference 3.0

    Spring 3.0中,新的表达式语言名叫Spring Expression Language(SpEL,直译就是Spring表达式语言)。Shaun将其描述为“嵌入在Spring编程模型上的,可以用来在Spring项目之间描述任务以及配置的微型脚本语言。SpEL...

    跟我学spring3(8-13).pdf

    spring3基础知识 IoC DI Spring表达式 SpEL Spring JDBC支持 Spring ORM集成 Spring与其他web框架集成 Spring注解零配置 Spring单元测试与集成测试

    Spring组件开发模式支持SPEL表达式

    今天小编就为大家分享一篇关于Spring组件开发模式支持SPEL表达式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    spring-boot-annotation-spel.zip

    SpringBoot 自定义注解,属性支持SPEL表达式。介绍了SPEL表达式的解析

    Spring spel表达式使用方法示例

    主要介绍了Spring spel表达式使用方法示例,通过一些实例向大家展示了spel表达式的用法,需要的朋友可以了解下。

    Spring Cloud Gateway Actuator API SpEL表达式注入命令执行 0day 漏洞复现

    Spring Cloud Gateway Actuator API SpEL表达式注入命令执行 0day 漏洞复现

    xbean-spring-3.15.zip

    spring-framework.zip,spring表达式语言(spel)spring框架

Global site tag (gtag.js) - Google Analytics