Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。语法类似于 EL:SpEL 使用 #{…}
作为定界符,所有在大框号中的字符都将被认为是 SpEL,SpEL 为 bean 的属性进行动态赋值提供了便利。
通过 SpEL 可以实现:
- 通过 bean 的 id 对 bean 进行引用
- 调用方法以及引用对象中的属性
- 计算表达式的值
- 正则表达式的匹配
【1】SpEL应用字面量
字面量的表示:
- 整数:
<property name="count" value="#{5}"/>
- 小数:
<property name="frequency" value="#{89.7}"/>
- 科学计数法:
<property name="capacity" value="#{1e4}"/>
- String:可以使用单引号或者双引号作为字符串的定界符号:
<property name=“name” value="#{'Chuck'}"/>
<property name='name' value='#{"Chuck"}'/>
- Boolean:
<property name="enabled" value="#{false}"/>
【2】调用静态方法或静态属性
通过 T()
调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:
<bean id="car" class="com.web.spel.Car" scope="prototype">
<!-- 使用spEL为属性赋一个字面值 -->
<property name="brand" value="#{'Audi'}"></property>
<property name="price" value="500000.0"></property>
<!-- 使用spEL引用类的静态属性 -->
<property name="tyrePerimeter" value="#{T(java.lang.Math).PI*80}"></property>
</bean>
【3】引用 Bean、属性和方法
<bean id="person" class="com.web.spel.Person" scope="prototype">
<!-- 使用spEL为属性赋一个字面值 -->
<property name="name" value="Tom"></property>
<!-- 使用SpEL 来引用其他的 bean的属性 -->
<property name="city" value="#{address.city}"></property>
<!-- 在SpEL中使用运算符-->
<property name="info" value="#{car.price>300000?'金领':'白领'}"></property>
<!-- 使用SpEL 来引用其他的 bean -->
<property name="car" value="#{car}"></property>
</bean>
调用其他方法,还可以执行链式操作 :
<proterty name="suffix" value="#{sequenceGenerator.toString().toUpperCase()}"/>
【4】SpEL支持的运算符
- 算数运算符:
+, -, *, /, %, ^
<property name="modelCount" value="#{car.total+42}" />
- 加号还可以用作字符串连接
<constructor-arg value="#{user.firstName+''+user.lastName}"/>
- 比较运算符:
<, >, ==, <=, >=, lt, gt, eq, le, ge
<property name="equal" value="#{car.total==42}" />
- 逻辑运算符号:
and, or, not, |
<property name="outOfStock" value="#{!car.avaiable}" />
- if-else 运算符:
?: (ternary), ?: (Elvis)
<constructor-arg value="#{user.name=='jane'?'true'?'false'}"/>
- if-else 的变体
<constructor-arg value="#{user.name?'Greensleeves'}"/>
- 正则表达式:matches
<constructor-arg value="#{user.agematches '\d{2}'}"/>