什么是spEL表达式?
spEL是spring表达式语言,它是一种强大,简介的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean的属性或构造器参数中。
简单来说,以前我们装配Bean不管是值注入,还是其他Bean的引用,都是我们在编写Spring配置文件就确定好了的,而现在我们可以装配运行期才能确定的属性值。
spEL表达式都是用#{}标记的
spEL的字面值表达式,如
<property name="num" value="#{1}"/>
<property name="num" value="#{11.1}"/>
<property name="num" value="#{1e4}"/>
<property name="num" value="#{'a'}"/>//值为string类型时
<property name="num" value="#{true}"/>`
不过这么使用spEL表达式当然是没有意义的,但复杂的spEL都是有简单的构成,理解很有必要。
spEL表达式使用Bean的引用来获取Bean的属性
<bean id="me" class="com.xxx.xxx">
<property name="hobby" value="#{Tom.hobby}"/>
</bean>
这就可以把tom的hobby注入到我的hobby属性中
当然,spEL表达式不只能调用它的属性还有它的方法
假设songSelector是一个Bean,selectSong是它的方法返回一个song属性
<property name="song" value="#{songSelector.selectSong()}"/>//这就可以将返回的song注入我们的song
<property name="song" value="#{songSelector.selectSong().toUpperCase}"/>//还可以进行链式调用
selectSong()返回null时会出现空指针异常,解决办法如下
<property name="song" value="#{songSelector.selectSong()?.toUpperCase}"/>
这里使用了null-safe存取器,用 ?. 代替 . 会保证左边项不为null,如果返回的是null,则不会调用后面的toUpperCase方法。
用spEL操作类
在spEL表达式中调用类,一般使用T()运算符,它会返回一个类对象。我们可以通过它访问制定类的静态方法和常量。
如下
<property name="num" value="#{T(java.lang.Math).PI}"/>`//调用类的静态 变量
<property name="randomNum" value="#{T(java.lang.Math).random()}"/>//调用类的静态方法
spEL上可以使用的运算符
运算符类型 | 运算符 |
---|---|
算术运算 | +,-,*,/,%,^ |
关系运算 | <,>,==,<=,>=,lt、gt、eq、le、ge |
逻辑运算 | and、or、not、 |
条件运算 | ?: (ternary)、?: (Elvis) |
正则表达式 | matches |
spEL操作集合
操作集合是spEL表达式 的一大亮点
我们定义一个类
package com.csii.Person
public class Worker
{
private String name;
private String sex;
private int age;
}
然后我们创建集合
<util:list id="Person">
<bean class="package com.csii.Person.Worker"
p:name="tang" p:sex="男" p:age="22"/>
<bean class="package com.csii.Person.Worker"
p:name="gong" p:sex="男" p:age="31"/>
<bean class="package com.csii.Person.Worker"
p:name="chen" p:sex="女" p:age="23"/>
</util:list>
现在我们就能用spEL表达式操作集合
<property name="bestWorker" value="#{Person[2]}"/>//访问的是第三个人
<property name="oldworker" value="#{.?[age gt 30]}"/>//通过.?[]运算符完成查询操作
spEL还提供另外两种查询运算符(.^[])和(.$[])分别表示从集合中查询第一个匹配项和最后一个匹配项
投影运算符.![] 先只做了解 它可以将集合中每一个成员特定的属性放入一个新的集合。