版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/80273676
说起 SpEL,有过 jsp+servlet 基础的童鞋一定会联想到 EL表达式。没错!它是 Spring 中的EL表达式语言,语法也类似 EL表达式,使用 #{…} 作为定界符,所有在大括号中的字符都将被认为是 SpEL。
它存在的意义是: 为 bean 的属性进行动态赋值提供了便利。
通过 SpEL 可以实现:
1)通过 bean 的 id 对 bean 进行引用
2)调用方法以及引用对象中的属性
3)计算表达式的值
4)正则表达式的匹配
今天我们主要来讲一下它的四种用法:
一、字面量赋值
二、引用Bean、属性和方法(必须是public修饰的)
三、运算符
四、调用静态方法或静态属性
一、字面量赋值
<!-- 整数 -->
<property name="count" value="#{5}" />
<!-- 小数 -->
<property name="frequency" value="#{13.2}" />
<!-- 科学计数法 -->
<property name="capacity" value="#{1e4}" />
<!-- 字符串 #{"字符串"} 或 #{'字符串'} -->
<property name="name" value="#{'我是字符串'}" />
<!-- Boolean -->
<property name="enabled" value="#{false}" />
注: 1)字面量赋值必须要和对应的属性类型兼容,否则会报异常。
2)一般情况下我们不会使用 SpEL字面量赋值,因为我们可以直接赋值。
二、引用Bean、属性和方法(必须是public修饰的)
<!-- 引用其他对象 -->
<property name="car" value="#{car}" />
<!-- 引用其他对象的属性 -->
<property name="carName" value="#{car.name}" />
<!-- 引用其他对象的方法 -->
<property name="carPrint" value="#{car.print()}" />
三、运算符
1、算术运算符:+,-,*,/,%,^
<!-- 3 -->
<property name="num" value="#{2+1}" />
<!-- 1 -->
<property name="num" value="#{2-1}" />
<!-- 4 -->
<property name="num" value="#{2*2}" />
<!-- 3 -->
<property name="num" value="#{9/3}" />
<!-- 1 -->
<property name="num" value="#{10%3}" />
<!-- 1000 -->
<property name="num" value="#{10^3}" />
2、字符串连接符:+
<!-- 10年3个月 -->
<property name="numStr" value="#{10+'年'+3+'个月'}" />
3、比较运算符:<(<),>(>),==,<=,>=,lt,gt,eq,le,ge
<!-- false -->
<property name="numBool" value="#{10<0}" />
<!-- false -->
<property name="numBool" value="#{10 lt 0}" />
<!-- true -->
<property name="numBool" value="#{10>0}" />
<!-- true -->
<property name="numBool" value="#{10 gt 0}" />
<!-- true -->
<property name="numBool" value="#{10==10}" />
<!-- true -->
<property name="numBool" value="#{10 eq 10}" />
<!-- false -->
<property name="numBool" value="#{10<=0}" />
<!-- false -->
<property name="numBool" value="#{10 le 0}" />
<!-- true -->
<property name="numBool" value="#{10>=0}" />
<!-- true -->
<property name="numBool" value="#{10 ge 0}" />
4、逻辑运算符:and,or,not,&&(&&),||,!
<!-- false -->
<property name="numBool" value="#{true and false}" />
<!-- false -->
<property name="numBool" value="#{true&&false}" />
<!-- true -->
<property name="numBool" value="#{true or false}" />
<!-- true -->
<property name="numBool" value="#{true||false}" />
<!-- false -->
<property name="numBool" value="#{not true}" />
<!-- false -->
<property name="numBool" value="#{!true}" />
5、条件运算符:?true:false
<!-- 真 -->
<property name="numStr" value="#{(10>3)?'真':'假'}" />
6、正则表达式:matches
<!-- true -->
<property name="numBool" value="#{user.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}'}" />
四、调用静态方法或静态属性
通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:
<!-- 3.141592653589793 -->
<property name="PI" value="#{T(java.lang.Math).PI}" />