Spring 表达式语言 (一)

本文深入探讨Spring表达式语言(Spel),解释其特性与优势,包括使用Bean ID引用方法与属性,引用其他Bean,进行算术、逻辑与关系运算,以及如何在配置中灵活运用Spel实现更高效、简洁的Bean装配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring 表达式语言 (Spring Expression Language)是Spring 3.0开始引入的,它是一种强大、简洁的装配Bean的方式,能在运行时执行表达式将值(包括引用)注入到Bean。

SpEL的特性包括,

  1. 使用Bean的ID引用
  2. 调用方法或访问属性
  3. 进行算术、逻辑或关系运算
  4. 正则表达式
  5. 集合操作

  • 字面值

最简单的SpEL就是一个字面值,

使用${}。

如将数字8装配到下面的属性:

<property name="count“ value="#{8}" />

也可以是浮点数或科学记数法或是布尔值。下面是使用一个String类型的字面值。

<property name="name" value="#{'ChenZhongPu'}" />
使用只要满足单引号双引号间隔就可以,这样也是合法的:

<property name="name" value='#{"ChenZhongPu"}' />


你也可以和非SpEL表达式混用:

<property name="msg" value=”hello #{5}“ />

确实只使用字面值的SpEL是没有意义的,但这是复杂表达式的基础。


  • 引用Bean,方法和属性

SpEL的另一个基本功能是通过ID引用其他Bean,

<property name="son" value="#{tom}"

tom是另一个Bean的ID。当然,使用ref也可以完成这一工作。

使用tom的age属性装配,

<span style="font-size:18px;"><property name="son-age" value="#{tom.age}"</span>

当然,age必须有getter方法。

如果tom的类有个方法getBestLovedMoive()返回最喜欢的电影,

<property name="son-movie" value="#{tom.getBestLovedMovie()}" />
如果装配的希望是大写字母:

<property name="son-movie" value="#{tom.getBestLovedMovie().toUpperCase()}" />
这种情况最怕的就是出现空指针异常,

<property name="son-movie" value="#{tom.getBestLovedMovie()?.toUpperCase()}" />
使用?.可以完成null-safe存取。


  • T()运算符

使用T()运算符可以调用类作用域(静态)的方法和常量。

如:

<property name="pi" value="#{T(java.lang.Math).PI}" />

  • 算术运算符

除了支持+ - * / %,还支持 ^表示乘方算法。

使用起来很简单,如

<property name="test" value="#{tom.age - 18}" />
+还可以完成字符串的拼接。

<peoperty name=”fullname" value="#{tom.firstName + ' ' + tom.lastName}" />

  • 比较值

比较返回的都是布尔类型。由于 > <在XML里有特殊含义(在XML文件外使用SpEL也是可以的)。其文本类型如下:


使用==或eq是等价的。


  • 逻辑表达式

有and, or ,not(或!)三种。意思很明了,这里举个例子,

<property name="testlogic" value="#{tom.name == 'czp' and tom.age gt 18}" />

  • 条件表达式

和Java的三元运算符一样。

如:

<property name="ancestor" value="#{tom.age gt 20 ? tom : Jim}" />

这个运算的一个常用场景是检查一个值是否为null。

<span style="font-size:18px;"><property name="movie" value="#{tom.movie != null ? tom.movie : 'King Of Lion'}" /></span>
你可以使用简写方法:

<span style="font-size:18px;"><property name="movie" value="#{tom.movie != null ?: 'King Of Lion'}" /></span>

  • 正则表达式
使用matches对文本处理,返回布尔类型。
举个例子:
<property name="validPhone" value="#{tom.phone matches '[0-9]{11}'}" />



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值