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}'}"/>