简介
Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
语法:
EL:SpEL 使用 #{...} 作为定界符
所有在大框号中的字符都将被认为是 SpEL
- SpEL 为 bean 的属性进行动态赋值提供了便利,通过SpEL可以实现:
– 通过bean的id对bean进行引用
– 调用方法以及引用对象中的属性 – 计算表达式的值
– 正则表达式的匹配
SpEL:字面量
并不常用SpEL:字面量
<bean id="car" class="com.spring.helloworld.Car">
<!-- 整数: -->
<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}"/>
</bean>
SpEL:引用 Bean、属性和方法
- 引用其他对象
<bean id="car1" class="com.spring.helloworld.Car">
<!-- 通过 value 属性和 SpEL 配置 bean 之间的应用关系 -->
<property name="prefix" value="#{prefixGenerator}"/>
</bean>
- 引用其他对象的属性
<bean id="car1" class="com.spring.helloworld.Car">
<!-- 通过 value 属性和 SpEL 引用另一个 bean 的 suffix 属性值 -->
<property name="suffix" value="#{sequenceGenerator2.suffix}"/>
</bean>
- 调用其他方法,可以链式操作
<bean id="car1" class="com.spring.helloworld.Car">
<!-- 通过 value 属性和 SpEL 引用另一个 bean 的 方法的返回值 -->
<property name="suffix" value="#{sequenceGenerator2.toString()}"/>
<!-- 方法的连缀 -->
<property name="suffix" value="#{sequenceGenerator2.toString().toUpperCase()}"/>
</bean>
- 调用静态方法或静态属性
通过T()调用一个类的静态方法,它将返回一个Class Object,然后再调用响应的方法或属性。
<bean id="car1" class="com.spring.helloworld.Car">
<property name="initValue" value="#{T(java.lang.Math).PI}"/>
</bean>
SpEL支持的运算符号
- 算数运算符:+, -, *, /, %, ^:
<bean id="car1" class="com.spring.helloworld.Car">
<property name="adjustedAmount" value="#{counter.total + 42}"/>
<property name="adjustedAmount" value="#{counter.total - 20}"/>
<property name="circumference" value="#{2 * T(java.lang.Math).PI * circle.radius}"/>
<property name="average" value="#{counter.total / counter.count}"/>
<property name="remainder" value="#{counter.total % counter.count}"/>
<property name="area" value="#{2 * T(java.lang.Math).PI * circle.radius ^ 2}"/>
</bean>
- 字符串连接加号: +
<bean id="car1" class="com.spring.helloworld.Car">
<constructor-arg value="#{performer.firstName + ' ' + performer.lastName}"></constructor-arg>
</bean>
- 比较运算符:<, >, ==, <=, >=, lt, gt, eg, le, ge
<bean id="car1" class="com.spring.helloworld.Car">
<property name="equal" value="#{counter.total == 100}"/>
<property name="hasCapacity" value="#{counter.total le 100000}"/>
</bean>
- 逻辑运算符号: and, or, not, !
<bean id="car1" class="com.spring.helloworld.Car">
<property name="largeCircle" value="#{shape.kind == ' circle' and shape.perimeter gt 10000}"/>
<property name="outOfStock" value="#{!product.available}"/>
<property name="outOfStock" value="#{not product.available}"/>
</bean>
- if-else 运算符:?: (ternary), ?: (Elvis)
<bean id="car1" class="com.spring.helloworld.Car">
<constructor-arg value="#{songSelector.selectSong() == 'Jingle Bells' ? piano : 'Jingle Bells'}"></constructor-arg>
</bean>
- if-else 的变体
<bean id="car1" class="com.spring.helloworld.Car">
<constructor-arg value="#{kenny.song ? 'GreensLeeves'}"></constructor-arg>
</bean>
- 正则表达式:matches
<bean id="car1" class="com.spring.helloworld.Car">
<constructor-arg value="#{admin.email matches '[a-zA-Z0-9._%+-]+\\.[a-zA-Z{2,4}]'}"></constructor-arg>
</bean>