SpEL表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpEL表达式相关的知识,希望对你有一定的参考价值。

参考技术A 从Spring 3开始引入了Spring表达式语言,它能够以一种强大而简洁的方式将值装配到Bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值。使用SpEL你可以实现超乎想象的装配效果,这是其他装配技术很难做到的。它包含了很多特性:

我们时常用到SpEL表达式,例如Spring Security也支持使用SpEL表达式定义安全限制规则。另外在Spring MVC应用中使用Thymeleaf模版作为视图的话,那么这些模版可以在SpEL表达式引用模型数据。

我们都知道属性占位符“$...”,而SpEL表达式则要放到“#...”中,下面这个例子可能是最简单的SpEL表达式了

除去“#...”之后的内容就是SpEL表达式了,例子是一个数字常量,这个表达式的计算结果就是数字1。

当然在实际的运用中,我们可能会用到更有意思的表达式如

它最终的结果的就是计算当前一刻的毫秒数。T()表达式会将java.lang.System视为Java应用中对应的类型,因此可以调用其static修饰的currentTimeMillis()方法。

SpEL表达式也可以引用其他的bean或者其他bean的属性。例如,如下的表达式会计算得到ID为sgtPeppers的bean对象的airist属性。以及通过systemProperties对象引用系统属性;

之前我们使用@Value获取配置到 .properties文件中的值,在之后我们了解到SpEL表达式后,还可以使用这一的表达式去描述。相应的,我们一样能够将SpEL表达式运用在XML的配置文件中

A) 表示字面量

我们之前使用表达式表示了一个字面量的例子(#1),它实际上还可以表示浮点数、String和Boolean的类型,如下所示。当然这很简单,后面复杂的会用到它们。

B)引用bean、属性和方法

SpEL可以通过bean的ID去引用这个bean,我们可以使用SpEL将一个bean装配到另外一个bean中,此时beanID作为SpEL表达式(本例还是用上面的sgtPeppers)

当然为了防止这个方法的返回值为空,上面的这个方法可以这样改

发现表达式中间仅多了一个“?”号,它表示的意思是如果selectArtist()方法的返回值不是null的话就执行大写操作,否则就不执行大写操作。

C)在表达式中使用类型

如果要在SpEL中访问类作用域的方法和常量的话,要依赖T()这个关键的运算符。例如,为了在SpEL中表达Java的Math类,需要按照如下的方式使用T()运算符。其中T()运算符的结果将会是一个Class类。如果需要的话,我们甚至可以将其装配到一个Class类型的bean属性中。但是T()运算符的真正价值在于它能够访问静态方法和常量

D)SpEL运算符

运算符类型 运算符
算术比较 +、-、*、/、%、^
比较运算 <、>、==、<=、>=、lt、gt、rq、le、ge
逻辑运算 and、or、not、|
条件运算 ?: (ternary)、?:(Elvis)
正则表达式 matches

话不多说直接举例:

E)计算集合

除了上面的内容之类,SpEL还加入了一些关于集合的技巧。最简单的可能就是引用一个简单列表中的元素了

这句话表示计算songs集合中的第五个元素(从0开始)的title属性,这个属性来源于beanID为jukebox的bean。当然我们还可以丰富一下它的内容,比如说随机选一首歌:

"[]"运算符用来从集合或者数组中按照索引获取元素,实际上,它还可以从String中获取一个字符,例如

SpEL还提供了查询运算符(.?[]),它会用来对集合进行过滤,得到集合的一个子集。比如我们现在想要从jukebox中artist属性为Aerosmith的所有歌曲

可以看到选择运算符在它的 ’ [] ‘ 中接受了另外一个表达式。当SpEL表达式迭代歌曲列表的时候,会对歌曲列表中的每一个条目计算这个表达式。如果表达式的计算结果为true的时候,那么条目会放到新的集合中去。否则的话,它就不会放到新的集合中去。

除了“.?[]”之外,还有两种查询运算符“.^[]” 、“.$[]”,他们分别用来在集合中查询第一个匹配项和最后一个匹配项。

最后,SpEL还提供了投影运算符(.![]),它会从集合的每个成员中选择特定的属性放到另外一个集合中。作为样例,假设我们不想要歌曲对象的集合,而是要获取所有歌曲的名称的集合。如下的表达式会替我们完成将title属性投影到一个新的String类型的集合中:

这个运算符一样可以和其他的运算符一起使用。比如我们可以使用如下的表达式获取Aerosmith所有歌曲的名称列表:

到目前只是一些皮毛,仅供参考。

以上是关于SpEL表达式的主要内容,如果未能解决你的问题,请参考以下文章

SpEL表达式

SpEL表达式

Spring IOC机制使用SpEL

spring 中spel 的用法

CDI FEATURES

Spring_SpEL