`
zzc1684
  • 浏览: 1224274 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring 表达式语言 (Spring Expression Language) SpEL

阅读更多

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]}"/> 
分享到:
评论

相关推荐

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

    Spring SpEL(Spring Expression Language)是一种强大的表达式语言,用于处理运行时查询和操作对象图。SpEL 的设计目标是提供一种灵活的方式来访问和操作对象,特别适用于在 Spring 容器中配置 bean 的属性和行为。...

    spring spEL 表达式详解

    Spring Expression Language,简称SpEL,是Spring框架中的一个强大表达式语言,用于在运行时查询和操作对象图。它提供了丰富的表达式语法,支持属性访问、方法调用、算术运算、逻辑判断以及控制流等操作,极大地简化...

    Spring开发手册_表达式语言_API中文版

    Spring 表达式语言(Spring Expression Language,简称 SpEL)是 Spring 框架中一个强大的表达式系统,用于在运行时查询和操作对象图。它允许动态访问和修改对象属性、执行方法、进行算术运算以及进行条件和逻辑判断...

    spring3.0.2api 文档spring表达式语言

    Spring表达式语言(Spring Expression Language,简称SpEL)是Spring框架内置的一种强大且灵活的表达式语言,设计用于在运行时查询和操作对象图。SpEL提供了丰富的语法,允许开发者在应用程序中进行条件判断、方法...

    Spring_SpEl表达式使用用例

    Spring Expression Language (SpEL)是Spring框架中的一种强大而灵活的表达式语言,主要用于在运行时查询和操作对象图。它提供了在配置元数据中进行表达式评估的能力,使得我们可以更加动态地控制Spring应用程序的...

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

    Spring框架作为Java企业级应用程序的主流框架,提供了强大的组件开发模式,支持SPEL(Spring Expression Language)表达式,使得开发者能够更加灵活地使用表达式来实现业务逻辑。本文将详细介绍Spring组件开发模式...

    CVE-2022-22947 SpringCloud GateWay SpEL RCE.doc

    SpEL(Spring Expression Language)是一种基于Java的表达式语言,用于在Spring框架中定义和执行表达式。SpEL提供了许多功能,包括变量、方法调用、逻辑运算符等。 在该漏洞中,攻击者可以使用SpEL表达式来执行恶意...

    Spring Expression Language

    **Spring Expression Language (SpEL)** 是Spring框架中的一个强大特性,它提供了一种在运行时查询和操作对象图的表达式语言。SpEL允许在应用程序中动态地访问和修改对象,使得开发人员能够灵活地编写代码,而无需硬...

    spring-boot-annotation-spel.zip

    Spring Boot自定义注解配合SPEL(Spring Expression Language)表达式可以让我们实现更为灵活的逻辑控制。本压缩包“spring-boot-annotation-spel.zip”显然是关于如何在自定义注解中运用SPEL表达式的实例教程。 ...

    Spring 3.0-API 参考手册

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

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

    本文将详细探讨一个重要的安全问题——Spring Cloud Gateway Actuator API 的SpEL(Spring Expression Language)表达式注入漏洞(CVE-2022-22947),该漏洞可能导致命令执行,对系统安全构成严重威胁。首先,我们...

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

    在Spring框架中,SpEL(Spring Expression Language)提供了一种强大且灵活的方式来查询和操作对象图。Spring Bean定义支持使用SpEL来配置属性和依赖关系,允许开发者通过表达式语言来设置属性值或者调用方法。 ###...

    SpringCloud Function SpEL注入漏洞分析(CVE-2022-22963).doc

    SpEL(Spring Expression Language)是一种强大的表达式语言,用于在 Spring 框架中定义和执行复杂的业务逻辑。然而,在 SpringCloud Function 中,SpEL 的使用存在安全隐患。当攻击者可以控制 SpEL 表达式时,可能...

    pring3表达式语言共13页.pdf.zip

    Spring 3表达式语言(Spring Expression Language,简称SpEL)是Spring框架中一个强大的表达式系统,用于在运行时查询和操作对象图。它提供了一种简洁、灵活的方式来访问和操作对象属性,以及执行基本算术和逻辑运算...

    org.springframework.expression-3.1.1.RELEASE.jar

    其中,Spring Expression Language(简称SpEL)是Spring框架的一个重要组成部分,它为Spring应用程序提供了强大而灵活的表达式语言,用于在运行时查询和操作对象图。在3.1.1.RELEASE版本中,SpEL进一步增强了其功能...

    spring-expression-3.2.1.RELEASE.zip

    标题中的"spring-expression-3.2.1.RELEASE.zip"是一个Spring框架的组件,Spring Expression Language (SpEL) 的特定版本。SpEL是Spring框架的一部分,它提供了一种强大的表达式语言,用于在运行时查询和操作对象图...

    spring-expression

    Spring Expression Language(简称SpEL)是Spring框架中的一个强大功能,它提供了一种在运行时查询和操作对象图的表达式语言。SpEL被设计用来在Spring应用程序中进行数据绑定、AOP切点匹配以及动态方法调用等任务。...

Global site tag (gtag.js) - Google Analytics