概述
Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。
表达式语言给静态Java语言增加了动态功能。
SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用。
表达式语言一般是用最简单的形式完成最主要的工作,减少我们的工作量。
SpEL支持如下表达式:
一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;
二、类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;
三、集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;
四、其他表达式:模板表达式。
注:SpEL表达式中的关键字是不区分大小写的。
SpEL必需的Jar包:org.spring.expression.jar
关于SpEL的原理和接口,这篇博客有详细说明:http://jinnianshilongnian.iteye.com/blog/1416581
SpEL语法
基本表达式
一、字面量表达式:
SpEL支持的字面量包括:字符串、数字类型(int、long、float、double)、布尔类型、null类型:
●字符串
String str1 = parser.parseExpression("'Hello World!'").getValue(String.class);
String str2 = parser.parseExpression("\"Hello World!\"").getValue(String.class);
●数字类型
int int1 = parser.parseExpression("1").getValue(Integer.class);
long long1 = parser.parseExpression("-1L").getValue(long.class);
float float1 = parser.parseExpression("1.1").getValue(Float.class);
double double1 = parser.parseExpression("1.1E+2").getValue(double.class);
int hex1 = parser.parseExpression("0xa").getValue(Integer.class);
long hex2 = parser.parseExpression("0xaL").getValue(long.class);
●布尔类型
boolean true1 = parser.parseExpression("true").getValue(boolean.class);
boolean false1 = parser.parseExpression("false").getValue(boolean.class);
●null类型
Object null1 = parser.parseExpression("null").getValue(Object.class);
二、算数运算表达式:SpEL支持加(+)、减(-)、乘(*)、除(/)、求余(%)、幂(^)运算:
●加减乘除
int result1 = parser.parseExpression("1+2-3*4/2").getValue(Integer.class);//-3
●求余
int result2 = parser.parseExpression("4%3").getValue(Integer.class);//1
●幂运算
int result3 = parser.parseExpression("2^3").getValue(Integer.class);//8
SpEL还提供求余(MOD)和除(DIV)而外两个运算符,与“%”和“/”等价,不区分大小写。
三、关系表达式:等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=),区间(between)运算
●parser.parseExpression("1>2").getValue(boolean.class)将返回false;●parser.parseExpression("1 between {1, 2}").getValue(boolean.class)将返回true
between运算符右边操作数必须是列表类型,且只能包含2个元素。第一个元素为开始,第二个元素为结束,区间运算是包含边界值的,即 xxx>=list.get(0) && xxx<=list.get(1)。
SpEL同样提供了等价的“EQ” 、“NE”、 “GT”、“GE”、 “LT” 、“LE”来表示等于、不等于、大于、大于等于、小于、小于等于,不区分大小写。
四、逻辑表达式:且(and)、或(or)、非(!或NOT)
●parser.parseExpression("2>1 and (!true or !false)").getValue(boolean.class)返回true
●parser.parseExpression("2>1 and (NOT true or NOT false)").getValue(boolean.class)返回true
注:逻辑运算符不支持 Java中的 && 和 ||
五、字符串连接及截取表达式:使用“+”进行字符串连接,使用“'String'[0] [index]”来截取一个字符,目前只支持截取一个,如“'Hello ' + 'World!'”得到“Hello World!”;而“'Hello World!'[0]”将返回“H”。
六、三目运算及Elivis运算表达式:
三目运算符 “表达式1?表达式2:表达式3”用于构造三目运算表达式,如“2>1?true:false”将返回true;
Elivis运算符“表达式1?:表达式2”从Groovy语言引入用于简化三目运算符的,当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2,简化了三目运算符方式“表达式1? 表达式1:表达式2”,如“null?:false”将返回false,而“true?:false”将返回true;
七、正则表达式:使用“str matches regex,如“'123' matches '\\d{3}'”将返回true;
八、括号优先级表达式:使用“(表达式)”构造,括号里的具有高优先级。
类相关表达式
参考博客:http://jinnianshilongnian.iteye.com/blog/1418309
集合相关表达式
参考博客:http://jinnianshilongnian.iteye.com/blog/1418309
在配置文件中灵活运用相关表达式:
SpEL支持在Bean定义时注入,默认使用“#{SpEL表达式}”表示,其中“#root”根对象默认可以认为是ApplicationContext,只有ApplicationContext实现默认支持SpEL,获取根对象属性其实是获取容器中的Bean,通过Bean中的set方法可以得到根对象中的属性值。
可以参考这个里面的例子:http://jinnianshilongnian.iteye.com/blog/1418311
<bean id="world" class="java.lang.String">
<constructor-arg index="0" value="#{'Hello Spring!!!'[0]}"/>
<property name="pros">
<props value-type="java.lang.Long">
<prop key="1">First</prop>
<prop key="2">#{'Garent'}</prop>
<prop key="3">Tomcat</prop>
</props>
</property>
</bean>
<!-- 构造了一个String类型的属性 其他Bean直接引用aaa这个Bean就可以-->
<bean id="aaa" class="java.lang.String">
<constructor-arg value="%{' World!'}"/>
</bean>
分享到:
相关推荐
### Spring 表达式语言 (SpEL) 中文参考手册概览 #### 一、Spring SpEL 概念与用途 Spring SpEL(Spring Expression Language)是一种强大的表达式语言,用于处理运行时查询和操作对象图。SpEL 的设计目标是提供一...
在本文中,我们将深入探讨Spring 3.0.2 API文档中的核心组件,特别是Spring表达式语言(SpEL),它是Spring框架中的一个强大工具,用于在运行时查询和操作对象图。 Spring表达式语言(Spring Expression Language,...
Spring Expression Language,简称SpEL,是Spring框架中的一个强大表达式语言,用于在运行时查询和操作对象图。它提供了丰富的表达式语法,支持属性访问、方法调用、算术运算、逻辑判断以及控制流等操作,极大地简化...
Spring Expression Language (SpEL)是Spring框架中的一种强大而灵活的表达式语言,主要用于在运行时查询和操作对象图。它提供了在配置元数据中进行表达式评估的能力,使得我们可以更加动态地控制Spring应用程序的...
**Spring 表达式语言(SpEL)API 中文版** Spring 表达式语言(Spring Expression Language,简称 SpEL)是 Spring 框架中一个强大的表达式系统,用于在运行时查询和操作对象图。它允许动态访问和修改对象属性、...
Spring表达式语言SpEL用法详解 Spring表达式语言SpEL是一种强大的表达式语言,支持运行时查询和操作对象图。SpEL使用#{...}作为定界符,所有在大括号中的字符串均被认为是SpEL。SpEL为bean的属性进行动态赋值提供了...
基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志 ### 简介 * 使用annotation来标注方法,标记操作内容 * 使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息) * ...
### Spring表达式语言(SpEL)详解 #### 引言 Spring框架自3.0版本引入了一种全新的配置对象依赖注入的方式—Spring表达式语言(SpEL),这为开发人员提供了一个灵活且强大的工具,使得在配置文件或注解中进行复杂的...
SPEL表达式是Spring框架提供的一种表达式语言,允许开发者使用灵活的语法来表达复杂的业务逻辑。SPEL表达式可以用于实现各种业务逻辑,例如数据验证、数据转换、条件判断等。在Spring框架中,SPEL表达式可以与Bean...
### Spring3新特性详解 #### 一、模块组织与构建工具升级 在Spring3中,模块的组织方式变得更加细致和合理。从多个JAR包的划分可以看出,Spring采用了更为精细的模块化策略,使得开发者能够更容易地管理和使用特定...
opt-log基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志简介使用annotation来标注方法,标记操作内容使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息)同一个...
Spring Bean定义支持使用SpEL来配置属性和依赖关系,允许开发者通过表达式语言来设置属性值或者调用方法。 ### SpEL表达式语言基础 SpEL是一种表达式语言,可以在运行时构建复杂表达式、存取对象属性、调用方法、...
综上所述,Spring 3.0 的新特性极大地提升了开发者的生产力,提供了更灵活的配置方式,增强了对 RESTful 和 Java EE 6 的支持,以及引入了 SpEL 这样的强大表达式语言。这些改进使得 Spring 3.0 成为了一个更加现代...
SpEL是Spring框架内的一种强大的表达式语言,它允许在运行时查询和操作对象,包括属性访问、方法调用、算术运算、逻辑和比较操作等。 漏洞的根源在于Spring Cloud Gateway Actuator API 对用户输入的参数没有进行...
Spring spel表达式是一种功能强大且灵活的表达式语言,它允许开发者在Spring应用程序中使用表达式来实现复杂的逻辑操作。 Spring spel表达式可以用于引用bean、调用方法、计算表达式的值、正则表达式的匹配、集合的...
SpEL(Spring Expression Language)是一种基于Java的表达式语言,用于在Spring框架中定义和执行表达式。SpEL提供了许多功能,包括变量、方法调用、逻辑运算符等。 在该漏洞中,攻击者可以使用SpEL表达式来执行恶意...
SPEL是Spring框架提供的一种强大的表达式语言,用于在运行时查询和操作对象图。它允许我们执行各种操作,如属性访问、方法调用、条件语句、循环等,甚至可以执行计算和类型转换。在自定义注解中使用SPEL,我们可以...
SpEL(Spring Expression Language)是一种强大的表达式语言,用于在 Spring 框架中定义和执行复杂的业务逻辑。然而,在 SpringCloud Function 中,SpEL 的使用存在安全隐患。当攻击者可以控制 SpEL 表达式时,可能...
**Spring 3.0 新特性详解** Spring框架作为Java企业级应用开发的主流选择,其3.0版本的发布带来了许多显著的改进和创新。这个官方PPT资料深入剖析了这些新特性,使得开发者能够更好地利用Spring提升应用程序的效率...
SpEL的表达式结构通常以`#`字符开头,表示这是一个Spring表达式。属性访问可以通过`.`符号完成,如`#{person.name}`,这将获取person对象的name属性。方法调用也可以嵌套在属性访问中,如`#{person.getAddress()....