`

Spring expression 解读

 
阅读更多
SPEL表达式支持:
一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;
二、类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;
三、集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;
四、其他表达式:模板表达式。
注:SpEL表达式中的关键字是不区分大小写的。

表达式解析主要包括以下三点.

1. 单词分解
   规则如下:
1.	添加结束符[\0] ;
2.	转为char数组.  charAt(i)
3.	对每一个字符进行分解
a)	如果是字母,一直往后找,如果一直是字母或数字,下划线,$那么继续.
i.	如果该字符串只有2或3那么判断是否是操作符
1.	如果是操作符,以操作符token加入
2.	如果不是操作符,以一般的字符串token加入
b)	+ 以加号操作符加入.
c)	_ 与字母处理方式一样
d)	– 以头号操作符加入
e)	: 以冒号操作符加入
f)	. 以点号操作符加入
g)	, 以逗号操作符加入
h)	* 以乘号操作符加入
i)	/ 以除号操作符加入
j)	% 以百分号操作符加入
k)	( 以左括号操作符加入
l)	) 以右括号操作符加入
m)	[ 以左中括号操作符加入
n)	# 以井号操作符加入
o)	] 以右中括号操作符加入
p)	{ 以左大括号操作符加入
q)	} 以右大括号操作符加入
r)	@ 以@操作符加入
s)	^ 如果为组合^[,那么以组合操作符^[加入,否则以指数操作符加入
t)	! 如果为组合!=, ![,那么以组合操作符加入,否则以非操作符加入
u)	= 如果为组合==,那么以组合操作符加入,否则以相等操作符加入
v)	? 如果以组合?[,?:,?. 那么以组合操作符加入,否则以问号操作符加入
w)	$ 如果以组合$[,那么以组合操作符加入,否则同字母处理方式一样.
x)	> 如果以组合>=,那么以组合操作符加入, 否则以>操作符加入
y)	<如果以组合<=,那么以组合操作符加入, 否则以<操作符加入
z)	‘0~9’ ,以0x开头,那么处理为16进制,如果为数据,那么把数字作为一个组合,最后以L结尾为long数字。 带E,处理为进制数字.带f为float,带d为double,以Long,Int等操作符加入
aa)	‘ ’,’\t’,’\n’,’\r’,啥都不干
bb)	‘\’’,以字符串处理.
cc)	‘”’,以字符串处理
dd)	0 结束



2. 词法分析
1.	循环每一个token
2.	对每一个token进行处理[逻辑清晰,易处理]
i.	eatLogicalOrExpression[吃逻辑或表达式or]
1.	class OpOr extends Operator
a)	public BooleanTypedValue 
getValueInternal(ExpressionState state)
2.	abstract class Operator extends SpelNodeImpl
3.	class SpelNodeImpl implements SpelNode
4.	Object getValue(ExpressionState expressionState) throws EvaluationException;
5.	 
ii.	eatLogicalAndExpression[吃逻辑and]
iii.	eatRelationalExpression[吃关系(>,>=,<,<=,==,!=,instanceof, matches, between)]
iv.	eatSumExpression[吃统计(+-)](这里可以重写+方法,在EvaluationContext复写)
v.	eatProductExpression[吃产品*/%]
vi.	eatPowerExpression[吃power ^]
vii.	eatUnaryExpression[号+-!]
viii.	eatPrimaryExpression[吃主体]
ix.	eatStartNode [开始吃节点]
1.	int,long,float,Boolean,string push next return pop
2.	(,吃表达示从开头开始吃,)push 当前吃的东西 return true pop
3.	普通IDENTIFIER,(, eatPossiblyQualifiedId,)push Type引用户 pop
4.	普通IDENTIFIER,null,push null pop(maybeEatNullReference)
5.	普通IDENTIFIER ,new,maybeEatConstructorReference, ConstructorReference,pop
6.	普通IDENTIFIER,maybeEatMethodOrProperty, 
maybeEatMethodArgs,参数,为空表示属性,不为空表示为方法
7.	普通IDENTIFIER,maybeEatFunctionOrVar,#,方法参数,
8.	maybeEatBeanReference,@ bean引用
9.	maybeEatProjection ![
10.	maybeEatSelection $[
11.	maybeEatSelection [
12.	maybeEatInlineList {}
x.	如果节点为.,[,?.则请取下一个节点作为CompoundExpression,否则返回SpelNodeImpl
xi.	Return



3. 生成语法树
先执行最里面优先级最高的
数据操作符(^,*/%,+-,><>=<=!===,and,or)
10 * 10 + 1 + 2 * 3 + 5 * 2
	加载10(primary)
	加载* 再加载10 作为*组合(primary,*)
	加载+,加载(primary,*),结果为1,作为+组合
	加载+,加载(primary,*),  结果为2,* 那么2*3作为组合,那么再作为+组合
	以下的同…



4. 解析语法树
 执行具体的操作符,计算最后的结果

分享到:
评论
2 楼 baitian 2012-12-27  
苦逼看着源代码,原来兄弟也是过来人,欣慰啊,
1 楼 baitian 2012-12-27  

相关推荐

    Spring源码-interface21

    7. **Spring表达式语言(SpEL)**:Spring Expression Language允许在运行时查询和操作对象图。在2.1版本中,SpEL开始被引入,提供了一种强大的方式来表达bean属性和方法的值。 8. **事件驱动**:Spring支持事件...

    Wrox.Beginning.Spring.2015

    Spring表达式语言(SpEL, Spring Expression Language)是一种强大的查询和操作对象图的语言。本章讲解了SpEL的基本语法和用法,包括如何在Spring配置文件中使用SpEL表达式来引用其他Bean属性值等内容。 ### 使用...

    Spring 3.0 API

    下面,我们来深入解读Spring 3.0 API中的重要知识点。 首先,文档提到了Spring框架的介绍,其中包含了依赖注入和控制反转(IoC),这是Spring框架的核心概念之一。依赖注入(Dependency Injection, DI)允许我们...

    spring 源码

    以下是对Spring框架主要模块及其源码的详细解读: 1. **依赖注入(Dependency Injection, DI)** Spring 的核心特性之一是依赖注入,它允许开发者在运行时通过容器来管理对象及其依赖关系。DI 可以通过构造器注入...

    spring web flow 官方文档

    本文将对Spring Web Flow 2.30官方文档的关键知识点进行深入解读,旨在帮助开发者全面理解并掌握这一工具。 ### 一、Spring Web Flow 2.30概述 #### 1.1 What this guide covers 本指南全面覆盖了Spring Web Flow ...

    spring和struts的整合-aop的使用

    具体用途需要根据文件内容来解读。 总之,Spring与Struts2的整合能够提升应用的灵活性和可扩展性,而AOP的使用则进一步增强了代码的可维护性和透明度。通过深入理解和实践这些技术,开发者可以构建出更强大、更健壮...

    springjar.rar

    7. **Spring Expression Language (SpEL)**: SpEL是Spring表达式语言,它允许在运行时查询和操作对象图。它被广泛应用于Spring的配置中,用于动态评估表达式。 8. **Spring JDBC Template**: 提供了对JDBC的抽象,...

    spring源码(1),可直接导入eclipse

    1. **spring-expression**: 这是Spring表达式语言(Spring Expression Language, SpEL)的源代码。SpEL是一个强大且灵活的内嵌表达式语言,用于在运行时查询和操作对象图。它支持属性导航、方法调用、条件和逻辑运算...

    spring2.0-中文参考手册pdf.zip

    以下是对"spring2.0-中文参考手册pdf.zip"中可能包含的关键知识点的详细解读: 一、依赖注入(Dependency Injection, DI) Spring 2.0加强了依赖注入功能,使得组件之间的依赖关系可以通过配置文件或注解来管理,而...

    xufuji.rar_spring jsp_spring mvc_商务jsp_电子商务系统

    Spring JSP的优势在于其简洁的模板语法和强大的EL(Expression Language)表达式,使得开发者可以方便地访问后台数据并展示在页面上。同时,Spring JSP还支持Tiles、FreeMarker等视图解析器,增加了灵活性。 **...

    Sping基础jar包

    5. **spring-expression.jar**(Spring Expression Language, SpEL):这是一个强大的表达式语言,用于在运行时查询和操作对象图。SpEL允许在配置中进行复杂的逻辑判断,例如在bean的属性注入中动态计算值,或者在...

    Cron表达式解析 翻译为中英文.zip

    Cron表达式是Unix/Linux系统中的定时任务调度器Cron所使用的语法,也被广泛应用于Java世界,例如Quartz、Spring等框架。它允许用户以字符串的形式定义任务的执行时间,如分钟、小时、日期等。这个压缩包文件包含了对...

    JSP由浅入深详细解读

    - 虽然JSP仍然是Web开发的一种选择,但现代框架如Spring MVC、JSF提供了更高效、可维护的开发方式。 通过深入学习这个教程,你将能够熟练掌握JSP的各个方面,从基础到高级,为构建复杂的Java Web应用打下坚实的基础...

    基于ssm+jsp的家居商城系统源码数据库.zip

    本篇文章将详细解读一个基于SSM(Spring、SpringMVC、MyBatis)框架和JSP(JavaServer Pages)技术的家居商城系统源码数据库,为读者提供深入理解SSM+JSP开发模式及其在实际项目中的应用。 首先,SSM是Java企业级...

    基于springboot的旅游网站源码数据库.zip

    本篇文章将详细解读一个利用Java技术栈,特别是SpringBoot框架构建的旅游网站源码数据库。这是一份适用于毕业设计或项目开发的优秀案例,涵盖了SSM(Spring、SpringMVC、MyBatis)到SpringBoot的升级转变,以及JSP...

    班级同学录管理系统.zip

    "jspmum7mq"可能是项目源代码、配置文件或者数据库脚本,但由于文件名不明确,无法进一步详细解读。 在这样的项目中,开发者可能需要实现以下功能: 1. 用户注册与登录:包括身份验证、密码加密等。 2. 同学信息...

    基于ssm+jsp实验中心管理系统源码数据库.zip

    JSP结合EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)标签库,可以方便地展示数据和实现页面逻辑。 五、数据库设计 实验中心管理系统必然涉及到多张数据库表,如用户信息、实验课程、...

    最新设计ssm智能化小区管理系统--适合计算机毕设、大作业实训项目.rar

    开发者可能需要了解JSP指令、脚本元素、表达式以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)等概念。 `智能化小区管理系统.lw+ppt.zip`文件可能包含了项目的详细设计介绍和演示...

    基于springboot的文理医院预约挂号系统源码数据库.zip

    通过对源码的分析和数据库设计的解读,我们可以了解到该系统的关键技术和应用实践。 首先,SpringBoot是Spring框架的一个轻量级衍生品,它简化了Spring应用的初始搭建和配置工作。在本系统中,SpringBoot作为核心...

Global site tag (gtag.js) - Google Analytics