前言

Spring3引入了Spring表达式语言(SpEL),可以像jsp中的el表达式一样,在运行期动态执行,从而得到需要的值。
SpEL的特性包括:
- 使用Bean的ID来引用Bean
- 调用方法和访问对象的属性
- 对值进行算术、关系和逻辑运算
- 正则表达式匹配
- 集合操作

字面值

字面值是最简单的SpEL表达式。一个简单的SpEL表达式如下:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="age" value="#{5}" />
</bean>

#{}符号标记该内容为SpEL表达式。
浮点型数字也可以出现在SpEL表达式中:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="age" value="#{5.2}" />
</bean>

还可以使用科学计数法:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="age" value="#{1e4}" />
</bean>
age = 10000.0;

还可以true或者false:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="married" value="#{false}"/>
</bean>

String类型的字面值可以使用单引号或者双引号作为字符串的界定符:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="managerName" value="#{'Stream'}" />
</bean>

引用Bean、Properties和方法

SpEL的另外一个基本应用是使用ID来引用其它Bean。

<bean id="manager" class="com.stream.spring.spel.entity.Manager"><property name="name" value="Stream"/>
</bean>
<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="managerName" value="#{manager.name}" />
</bean>

还可以调用Bean中的方法:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="managerName" value="#{manager.getManagerName()}" />
</bean>

将名字变为小写:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="managerName" value="#{manager.getManagerName().toLowerCase()}" />
</bean>

上面的调用方式中,如果getManagerName()返回null,那么将会报错:

org.springframework.expression.spel.SpelEvaluationException: EL1011E:(pos 25): Method call: Attempted to call method toLowerCase() on null context object

为了避免null值的出现导致错误,可以用(?.)代替(.),这样当出现null时将忽略后面的操作。
对于字符串,可以使用[]根据索引取到相应的结果:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="managerName" value="#{T(com.stream.spring.util.StringUtil).toString('Streamwei')[3]}" />
</bean>
employee.managerName = "e";

注意索引是从0开始。

操作类

SpEL还能调用类的静态方法和和常量,使用T()运算符即可。

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="managerName" value="#{T(com.stream.spring.util.ConstUtil).MANAGER}" />
</bean>

如上面的代码,在com.stream.spring.util.ConstUtil中定义了一个常量,T(com.stream.spring.util.ConstUtil)返回ConstUtil的一个实例,然后取到该实例的MANAGER字段。静态方法一样的道理:

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="managerName" value="#{T(com.stream.spring.util.StringUtil).toString('Streamwei')}" />
</bean>

算术运算和逻辑运算

SpEL提供了多种运算符来操作表达式。

运算符类型 运算符
算术运算符 +、-、*、/、%、^(乘方运算)
关系运算符 <(lt)、>(gt)、==(eq)、<=(le)、>=(ge)
逻辑符类型 and、or、not、!
条件运算 ?A:B
正则表达式 matches

算术运算符中,除了+之外,其余的要求参与运算的都是数字。+的两边可以是字符串,这时候执行字符串合并的操作。操作数既可以是字面量,也可以是用SpEL求到的值。

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="age" value="#{30}"/><!--<property name="managerName" value="#{employee2.age >= 27 ? true : false}" />--><property name="married" value="#{employee2.age ge 27 ? true : false}" /></bean>

matches运算符有两个操作数,左边的参数是要检测的字符串,右边的参数是正则表达式,如果字符串匹配正则表达式返回true,否则返回false。

<bean id="employee" class="com.stream.spring.spel.entity.Employee"><property name="age" value="#{30}"/><property name="married" value="#{employee2.age matches '[0-9.]+'}" />
</bean>
employee.married = true

操作集合

SpEL主要用三个运算符来操作集合:

运算符 返回值
.?[] 根据条件在给定集合中查询元素,并返回一个由查询出的元素组成的新集合
.^[]、.$[] 从给定集合中查询第一个、最后一个元素,返回集合中的元素
.![] 从集合的每一个成员中选择指定的属性,返回一个新的集合,新的集合类型和原有集合不一定相同

首先定义一个list:

<util:list id="employees"><bean id="employee1" class="com.stream.spring.spel.entity.Employee"><property name="name" value="employee1"/><property name="age" value="21"/></bean><bean id="employee2" class="com.stream.spring.spel.entity.Employee"><property name="name" value="employee2"/><property name="age" value="22"/></bean><bean id="employee3" class="com.stream.spring.spel.entity.Employee"><property name="name" value="employee3"/><property name="age" value="23"/></bean><bean id="employee4" class="com.stream.spring.spel.entity.Employee"><property name="name" value="employee4"/><property name="age" value="24"/></bean><bean id="employee5" class="com.stream.spring.spel.entity.Employee"><property name="name" value="employee5"/><property name="age" value="25"/></bean><bean id="employee6" class="com.stream.spring.spel.entity.Employee"><property name="name" value="employee6"/><property name="age" value="26"/></bean>
</util:list>
  1. 用[]来获取集合
<bean id="manager" class="com.stream.spring.spel.entity.Manager"><property name="employees" value="#{employees[3]}"/>
</bean>
Result:
manager.employees.size() = 1;
manager.employees.get(0).getName = "employee4";
  1. 使用.?[]筛选出age>=23的记录
<bean id="manager" class="com.stream.spring.spel.entity.Manager"><property name="employees" value="#{employees.?[age ge 23]}"/>
</bean>
Result:
manager.employees.size() = 4;
manager.employees.get(0).getName = "employee3";
  1. 使用.^[]筛选出age>=23的记录的第一个元素
<bean id="manager" class="com.stream.spring.spel.entity.Manager"><property name="employee" value="#{employees.^[age ge 23]}"/>
</bean>
Result:
mananer.employee.name = "employee3";
  1. 使用.$[]筛选出age>=23的记录的最后一个元素
<bean id="manager" class="com.stream.spring.spel.entity.Manager"><property name="employee" value="#{employees.$[age ge 23]}"/>
</bean>
Result:
mananer.employee.name = "employee6";
  1. 使用.![]讲age>=23的元素的name抽取出来形成一个List
<bean id="manager" class="com.stream.spring.spel.entity.Manager"><property name="employeesName" value="#{employees.?[age ge 23].![name]}"/>
</bean>
Result:
manager.employeesName.size = 4;
manager.employeesName.get(0) = "employee3";
manager.employeesName.get(1) = "employee4";
manager.employeesName.get(2) = "employee5";
manager.employeesName.get(3) = "employee6";

注意.![]的筛选条件,不能写成[‘name’],否则会把’name’作为一个字符串:

<bean id="manager" class="com.stream.spring.spel.entity.Manager"><property name="employeesName" value="#{employees.?[age ge 23].![name]}"/>
</bean>
Result:
manager.employeesName.size = 4;
manager.employeesName.get(0) = "name";
manager.employeesName.get(1) = "name";
manager.employeesName.get(2) = "name";
manager.employeesName.get(3) = "name";

Spring之SpEL相关推荐

  1. Spring学习-- SpEL表达式

    转载自 https://www.cnblogs.com/goodcheap/p/6490896.html 目录 Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式 ...

  2. spring之SpEL表达式

    1.什么是SpEL表达式 SpEL表达式语言是一种表达式语言,是一种可以与一个基于spring的应用程序中的运行时对象交互的东西.有点类似于ognl表达式.总得来说SpEL表达式是一种简化开发的表达式 ...

  3. Spring总结——SpEL表达式

    文章目录 SpEL表达式 SpEL表达式概述 1.什么是SpEL表达式 2.SpEL表达式的作用 SpEL的使用方式 1.xml配置的方式 2.注解的方式 SpEL表达式的调用 SpEL表达式 SpE ...

  4. 【spring】spel表达式

    格式: #{ } 简单使用实例 一.DButil.java 代码实现: package springboottest.ioc.speltest;public class DBUtil {private ...

  5. Spring --- SpEL

    一)什么是SpEL SpEL -- Spring Expression Language. Spring的表达式语言.举个最简单的例子: Java代码 ExpressionParser parser ...

  6. Spring 3.0参考之SpEL

    http://sishuok.com/forum/blogPost/list/2463.html http://docs.spring.io/spring/docs/3.0.x/reference/e ...

  7. Spring 表达式语言(SpEL)

    本文纯属spring官方文档翻译版,详情请参考:Core Technologies Spring 表达式语言(简称"SpEL"),Spring Expression Languag ...

  8. Spring SpEL 的使用

    链接: 如何优雅记录日志. 链接: SpEL你感兴趣的实现原理浅析spring-expression. 链接: spEL-基础语法+注解中动态调用Bean方法. Spring EL Spring 3 ...

  9. 【Spring】ioc的常用注解

    背景 注解配置和Xml配置要实现的功能都是降低程序间的耦合.只是配置的形式不一样. 注解 曾经的XML配置 <bean id="accountService" class=& ...

最新文章

  1. uva live 4394 String painter 间隔dp
  2. uniapp动态设置style和class样式
  3. qpython3安装kivy_kivy库的安装
  4. oracle数据库登录失败触发器,oracle数据库登录、DDL触发器的应用
  5. ORA-600(qerltcInsertSelectRop_bad_state)错误
  6. C语言控制流对应的汇编语句
  7. python如何输入多个数据并增加到一个列表里_python 将表格多个列数据放到同一个单元格中...
  8. 接纳强迫,不要过于追求完美,允许自己慢下来,扎实的学习
  9. Exchange 日志/存储路径
  10. 嵌入式系统TinyOS学习资源
  11. oracle序列不连续,Oracle不连续的值,如何实现查找上一条、下一条
  12. 战神引擎php,战神引擎常用脚本接口
  13. ReadyBoost--Robbie 的基准测试
  14. python绘制国际象棋规则口诀_python图形工具turtle绘制国际象棋棋盘,
  15. get请求400错误 vue_VUE 配置proxy代理后,前台报错400 bad request
  16. 微软的面试题及答案-超变态但是很经典
  17. linux版高德导航软件下载,高德导航下载2021年最新版本_高德导航2021手机版下载-太平洋下载中心...
  18. 论文笔记:AAAI 2021 Beyond Low-frequency Information in Graph Convolutional Networks
  19. 安卓Android、iOS移动端车牌识别OCR技术原理
  20. 中学教学03教学原则与方法 04教学组织形式05教学评价

热门文章

  1. vue3 获取当前路由参数
  2. 2019徐州网络赛 G Colorful String 马拉车+后缀
  3. 国王游戏(贪心+模拟)
  4. 奉劝大家不要再用刷流量软件刷新浪博客等级了
  5. 大型游戏行业网络技术解决方案
  6. SVN 具体某一行代码是谁添加的
  7. 计算机链接手机网络游戏,怎么用手机玩Wegame电脑游戏 Wegame手机玩电脑游戏方法分享...
  8. APIO2015巴厘岛的雕塑——数位DP
  9. 1.1根据应收账款明细计算下个付息日的应计利息
  10. 部署dashboard