Spring表达式语言:SpEL
- Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言
- 语法类似于EL:SpEL使用#{…}作为定界符,所有在大框号中的字符都被认为是SpEL
- SpEL为bean的属性进行动态赋值提供了便利
- 通过SpEL可以实现:
- 通过bean的id对bean进行引用
- 调用方法以及引用对象中的属性
- 正则表达式的值
- 正则表达式的配置
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}“/>
SpEL:引用Bean、属性和方法
引用其他对象:
1
2<!-- 通过value属性和 SpEL 配置 Bean 之间的应用关系 -->
<property name = "prefix" value = "#{prefixGenerator}"></property>引用其他对象的属性
1
2<!-- 通过value属性和 SpEL 配置 suffix 配置值为另一个bean的suffix属性值 -->
<property name = "suffix" value = "#{sequenceGenerator2.suffix}"></property>调用其他方法,还可以链式操作
1
2
3
4<!-- 过value属性和 SpEL 配置 suffix 配置值为另一个bean的返回值 -->
<property name = "suffix" value = "#{sequenceGenerator2.toString()}"></property>
<!-- 方法的连缀 -->
<property name = "suffix" value = "#{sequenceGenerator2.toString().toUpperCase()}"></property>
SpEL支持的运算符号
算数运算符:+,-,*,%,^:
1
2
3
4
5<property name = "adjustedAmount" value = "#{counter.total + 43}" />
<property name = "adjustedAmount" value = "#{counter.total - 13}" />
<property name = "circumference" value = "#{2* T(java.lang.Math).PI * circle.radius}" />
<property name = "average" value = "#{counter.total / counter.total}" />
<property name = "area" value = "#{T(java.lang.Math).PI * circle.radius * 2}" />加号还可以用作字符串连接:
1
<constructor-arg value = "performer.firstName + ' ' + performer.LastName" />
比较运算符:<,>,==,<=,>=,lt,gt,eq,le,ge
1
2<property name="equal" value = "#{counter.total == 100}" />
<property name="hasCapacity" value = "#{counter.total le 100000}" />逻辑运算符号:and,or,not,|
1
2
3<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}" />if-else运算符:?:(temary),?:(Elvis)
1
<constructor-arg value = "#{songSelector.seLectSong()=='Jingle BeLLs'?piano:'Jingle Bells'}"/>
if-else的字体
1
<constructor-arg value = "#{kenny.song?:'Greensleeves'}"/>
正则表达式:matches
1
<constructor-arg value = "#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'}"/>
调用静态方法或静态方法:通过T()调用一个类的静态方法,它将返回一个ClassObject,然后再调用相应的方法或者属性:
1
<property name="initValue" value = "#{T(java.Lang.Math).PI}" />