1.简介
有别于传统的Spring静态配置,Spring Expression Language的值是在运行时,也就是Spring容器加载时计算出来的。
主要的功能包含:
1)ID引用Bean,执行对象的方法/获取对象的属性
2)数学、关系、逻辑运算
3)正则表达式匹配
4)操作集合
2.使用及举例
SpEL以"#{...}"进行标识。
1)ID引用Bean,执行对象的方法/获取对象的属性
--常量
整型 value="#{5}"
浮点型 value="#{5.1}"
科学计数法 value="#{1E4}"
字符型 value="hello, #{'java world'} !"
布尔型 value="#{true}"
--ID引用
value="#{beanID}" <==> ref="beanID"
--获取对象的属性
value="#{beanID.property}"
--执行对象的方法
value="#{beanID.getProperty()}"
--获取对象属性/执行对象方法时支持多个连续使用,也支持混合使用
value="#{beanID.property.toUpperCase()}"
value="#{beanID.getProperty().toUppserCase()}"
--空指针处理:在连接符"."之前加上"?",这样就会进行判断,如果是null则计算中止,直接返回null。
value="#{beanID.property?.toUpperCase()}"
value="#{beanID.getProperty()?.toUppserCase()}"
--static属性和方法
使用T(fullClassName)来获取static属性/方法对应的类对象
value="#{T(java.lang.Math).PI}"
value="#{T(java.lang.Math).random()}"
2)数学、关系、逻辑运算
--数学运算:+,-,*,/,%,^
value="#{person.age * 10}"
测试时发现此时可能出现错误,如果person.age = 24.56,计算出的结果却为240.0
同样也支持字符串+
value="#{'Hello, ' + person.name}"
--关系运算:<,>,==,<=,>=,lt,gt,eq,le,ge
value="#{person.age == 10}"
--逻辑运算:and, or, not, !
value="#{person.age eq 10 and not person.male}"
--三元判断: ?:(...),?:(...)
value="#{person.age ge 18 ? 'adult':'minor'}"
3)正则表达式匹配:matches
value="#{person.name matches 'huang.*'}"
4)操作集合
--获取集合中的某一元素
value="#{list[index]}"
value="#{map[key]}"
注:SpEL内置了两个特殊的Properties对象SystemEnvironment和SystemProperties
SystemEnvironment为OS环境变量
SystemProperties为JVM启动参数(JVM启动时通过-Dxxx传入)
[index]还可以用来获取String中的字符
--获取集合中的多个元素:过滤
.?:所有符合条件的元素
value="#{persons.?[age ge 18]}"
.^:第一个符合条件的元素
value="#{persons.^[age ge 18]}"
.$:最后一个符合条件的元素
value="#{persons.$[age ge 18]}"
--根据集合构建新集合
.!
新集合元素可以为原集合元素的属性,也可以为原集合某些元素的运算结果
value="#{persons.![name]}"
value="#{persons.![firstName + '.' + lastName]}"
3.使用须知
尽量少使用SpEL,除非真正需要
4.参考资料
Spring in Action 3rd(附件)