文档章节

spring的spel

尚浩宇
 尚浩宇
发布于 2015/11/02 15:36
字数 1188
阅读 51
收藏 0

 Spring 3.0 创建了一种新的方式用以配置对象的注入(set注入或者构造参数注入),它便是SpEL (Spring Expression Language)下面我们一一做一介绍。

▲基础特性

——SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL.

——1、 字面量的表示 

  1>整数

  1. <property name="count" value="#{5}"/>  

 2>小数


  1. <property name="frequency" value="#{89.7}"/>  


  3>科学计数法


  1. <property name="capacity" value="#{1e4}"/>  


 4>String可以使用单引号或者双引号作为字符串的定界符号。


  1. <property name="name" value="#{'Chuck'}"/>  

  2. <property name='name' value='#{"Chuck"}'/>  


 5>Boolean


  1. <property name="enabled" value="#{false}"/>  


——2、 引用Bean,属性和方法

 1>引用其他对象


  1. <bean id=”saxophone” value=”com.xxx.xxx.Xxx”/>  

  2. <bean ..>  

  3. .  

  4. <property name="instrument" value="#{saxophone}"/>  

  5. .  

  6. <bean/>  


通过id:“saxophone”将对象注入到instrument属性中,这与下面的配置是一样的:


  1. <property name="instrument" ref="saxophone"/>  


  2> 引用其他对象的属性


  1. <bean id="carl"  

  2. class="com.springinaction.springidol.Instrumentalist">  

  3. <property name="song" value="#{kenny.song}" />  

  4. </bean>  


kenny是Bean Id 而 song是属性的名字,这样配置就如同我们写了如下的代码


  1. Instrumentalist carl = new Instrumentalist();  

  2. carl.setSong(kenny.getSong());  

 3>调用其他方法


  1. <property name="song" value="songSelector.selectSong()"/>  


调用了BeanId为“songSelector”的对象的selectSong()方法,并将返回值注入到song属性中。或者还可以链式操作。如下:


  1. <property name="song" value="songSelector.selectSong().toUpperCase()"/>  


如果songSelector.selectSong()返回null的还会抛出异常,为了避免我们要使用?.表达式。这样如果songSelector.selectSong()为null就不会再调用后面的方法了。如下


  1. <property name="song" value="songSelector.selectSong()?.toUpperCase()"/>  


 4>调用静态方法

我们已经知道如何通过一个对象调用它的方法了,但是如何调用一个静态方法呢?用T()。它将返回一个 Class object
然后我们再调用相应的方法即可: 


  1. <property name="multiplier" value="T(java.lang.Math).PI"/>  


▲SpEL支持的运算符号
——1、算数运算符:+, -, *, /, %, ^


  1. <property name="adjustedAmount" value="#{counter.total + 42}"/>  

  2. <property name="adjustedAmount" value="#{counter.total - 20}"/>  

  3. <property name="circumference" value="#{2 * T(java.lang.Math).PI * circle.radius}"/>  

  4. <property name="average" value="#{counter.total / counter.count}"/>  

  5. <property name="remainder" value="#{counter.total % counter.count}"/>  

  6. <property name="area" value="#{T(java.lang.Math).PI * circle.radius ^ 2}"/>  


加号还可以用作字符串连接


  1. <property name="fullName" value="#{performer.firstName + ' ' + performer.lastName}"/>  


——2、比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge


  1. <property name="equal" value="#{counter.total == 100}"/>  


不可以使用<和>号,应为在xml中它有特殊的含义,我们使用lt和gt代替


  1. <property name="hasCapacity" value="#{counter.total le 100000}"/>  


——3、 逻辑运算符号: and, or, not, |


  1. <property name="largeCircle" value="#{shape.kind == 'circle' and shape.perimeter gt 10000}"/>  

  2. <property name="outOfStock" value="#{!product.available}"/>  

  3. <property name="outOfStock" value="#{not product.available}"/>  


——4、 If-else运算符:?: (ternary), ?: (Elvis)

〇最基本的 ?:(这如同我们在使用EL表达式语言):


  1. <property name="instrument" value="#{songSelector.selectSong() == 'Jingle Bells' ? piano : ' Jingle Bells '}"/>  

〇变体的 ?:

 <property name="song" value="#{kenny.song != null ? kenny.song : 'Greensleeves'}"/>

上下两种是同一语义,但下面的明显简洁


  1. <property name="song" value="#{kenny.song ?: 'Greensleeves'}"/>  


——5、 正则表达式:matches


  1. <property name="validEmail" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'}"/>  


表达式返回逻辑值,如果匹配返回true,否则返回false


▲SpEL对集合的支持

——环境

有实体City定义如下:


  1. package com.habuma.spel.cities;  

  2. public class City {  

  3. private String name;  

  4. private String state;  

  5. private int population;  

  6. }  


Xml中有如下定义


  1. <util:list id="cities">  

  2. <bean class="com.habuma.spel.cities.City"  

  3. p:name="Chicago" p:state="IL" p:population="2853114"/>  

  4. <bean class="com.habuma.spel.cities.City"  

  5. p:name="Atlanta" p:state="GA" p:population="537958"/>  

  6. <bean class="com.habuma.spel.cities.City"  

  7. p:name="Dallas" p:state="TX" p:population="1279910"/>  

  8. <bean class="com.habuma.spel.cities.City"  

  9. p:name="Houston" p:state="TX" p:population="2242193"/>  

  10. <bean class="com.habuma.spel.cities.City"  

  11. p:name="Odessa" p:state="TX" p:population="90943"/>  

  12. <bean class="com.habuma.spel.cities.City"  

  13. p:name="El Paso" p:state="TX" p:population="613190"/>  

  14. <bean class="com.habuma.spel.cities.City"  

  15. p:name="Jal" p:state="NM" p:population="1996"/>  

  16. <bean class="com.habuma.spel.cities.City"  

  17. p:name="Las Cruces" p:state="NM" p:population="91865"/>  

  18. </util:list>  


——1、 获取Collection中的某个对象

〇通过下标访问,如下:


  1. <property name="chosenCity" value="#{cities[2]}"/>  

我们就会获得population为"1279910"的city(记住下标从0开始)

〇下标可以通过变量指定,如下:


  1. <property name="chosenCity" value="#{cities[T(java.lang.Math).random() * cities.size()]}"/>  


〇如果是从Map中获得,可指定key值,如下


  1. <property name="chosenCity" value="#{cities['Dallas']}"/>  


〇也可以通过key访问properties的值,如下


  1. <util:properties id="settings" location="classpath:settings.properties"/>  

  2. <property name="accessToken" value="#{settings['twitter.accessToken']}"/>  


〇可以通过下标访问systemEnvironment和SystemProperties中的值


  1. <property name="homePath" value="#{systemEnvironment['HOME']}"/>  


〇如果在jre运行时配置了-Dapplication.home=/etc/myapp,我们可以通过如下方式访问


  1. <property name="homePath" value="#{systemProperties['application.home']}"/>  


〇通过下标获取String串中的某个字符


  1. 'This is a test'[3]  


——2、获取Collection中的子集-通过条件筛选(注意新对象是一个新的Collection)

   1>筛选子集(.?[])


  1. <property name="bigCities" value="#{cities.?[population gt 100000]}"/>  


   2>获取第一个(.^[])


  1. <property name="aBigCity" value="#{cities.^[population gt 100000]}"/>  


   3>获取最后一个(.$[])


  1. <property name="aBigCity" value="#{cities.$[population gt 100000]}"/>  


——3、集合的投影(.![])

 如果想获得所有城市的名称组成的列表,可用如下操作


  1. <property name="cityNames" value="#{cities.![name]}"/>  

将返回"Chicago", "Atlanta", "Dallas"

也可以组合两个列,如下:


  1. <property name="cityNames" value="#{cities.![name + ', ' + state]}"/>  

将返回"Chicago, IL", "Atlanta, GA", and "Dallas, TX".

—— 4、将投影和筛选结合


  1. <property name="cityNames" value="#{cities.?[population gt 100000].![name + ', ' + state]}"/>  



 



本文转载自:http://blog.csdn.net/gudong2945/article/details/7330642

上一篇: spring的XML装配
下一篇: redis拾遗
尚浩宇

尚浩宇

粉丝 70
博文 151
码字总数 126696
作品 4
朝阳
程序员
私信 提问
Spring Bean定义中表达式语言的支持

SpEL(Spring Expression Language,Spring表达式语言)的一个重要的作用就是扩展Spring容器的功能,允许在Bean定义中使用SpEL。XML配置文件和Annotation中都可以使用SpEL。在XML和Annotatio...

摆渡者
2014/03/09
342
0
《Spring5学习》 03 运行时值注入

Spring的运行时值注入是为了在一些应用场景避免将属性值硬编码在配置类中而提供的解决方案,Spring目前提供了几种方式实现运行时值注入,下面我们分别来讲下 1 - Spring中的Environment 在S...

老韭菜
2018/08/14
35
0
说说 Spring 表达式语言(SpEL)的核心类与用法

Spring 表达式语言 Spring Expression Language(简称 SpEL )是一个支持运行时查询和操作对象图的表达式语言 。 语法类似于 EL 表达式 ,但提供了显式方法调用和基本字符串模板函数等额外特...

deniro
2018/09/08
0
0
Spring-data-commons(CVE-2018-1273)漏洞分析

  前言   CVE-2018-1273 是 Spring-data-commons近期爆出的一个可远程执行代码的漏洞,为了了解更多细节,本文将从漏洞的成因,漏洞的判定以及漏洞的利用三个方面来进行详细说明。   漏...

FreeBuf
2018/06/01
0
0
Spring Integration 4.1 Milestone 1 发布

Spring Integration 4.1 Milestone 1 发布,现已提供在 Milestone Repository,可以使用 Maven 和 Gradle 安装升级,也可以直接下载。 Spring Integration 4.1 Milestone 1 包括一些新特性,...

oschina
2014/09/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Security 自定义登录认证(二)

一、前言 本篇文章将讲述Spring Security自定义登录认证校验用户名、密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Security...

郑清
27分钟前
3
0
php yield关键字以及协程的实现

php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还有另外一种特殊对象,也就是继承...

冻结not
40分钟前
4
0
servlet请求和响应的过程

本文转载于:专业的前端网站➥servlet请求和响应的过程 1.加载 Servlet类被加载到Java虚拟机中,并且实例化。在这个过程中,web容器(例如tomcat)会调用Servlet类的公开无参构造函数,产生一...

前端老手
40分钟前
4
0
golang 1.13 errors 包来了,不用写“err 气功波”代码

引 这篇是对 errors 包 的姿势挖掘 气功波错误代码 从 http.Get()返回的错误 判断 syscall.ECONNREFUSED 错误.以前要对 go 标准库 error 结构有点熟悉,才能写出下面的代码 func CmdErr(err ...

guonaihong
44分钟前
28
0
喜玛拉雅已听书单

时间倒序排 书名 作者 状态 唐砖 孑与2 进行中 死灵之书(克苏鲁神话合集) 阿卜杜拉·阿尔哈萨德 进行中 赡养人类 刘慈欣 完结 赡养上帝 刘慈欣 完结 中国太阳 刘慈欣 完结 中国太阳 刘慈欣...

Alex_Java
45分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部