第五章、SpEL
SpEL:Spring Expression Language, Spring 表达式语言
(一)SpEL特点
- SpEL是强大的表达式语言,
- 支持运行时查询、操纵一个对象图功能。
- SpEL语言的语法类似于EL,但提供了更多的功能,最主要的是显式方法调用和基本字符串模板函数
- SpEL是一个基于技术中立的API,允许需要时与其他表达式语言集成。
- SpEL与Spring不是直接绑定关系,它可以独立存在,并应用到其它平台
(二)SpEL支持如的功能:
- 基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;
- 类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;
- 集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;
- 其他表达式:模板表达式。
(三)SpEL基本语法:
XML配置文件中使用 :#{表达式}
Bean注解中使用 :@Value("#{表达式 }")
引用其它对象的属性: #{对象名.属性}
(四)SpEL基本使用:
1.XML中使用 :
#{表达式}
<bean id="a" class="com.tjetc.domain.A">
<property name="i" value="#{10^2}"></property>
</bean>
2.Bean注解中使用 :
@Value("#{表达式 }")
@Value("#{10+2}")
private int i;
3.引用其它对象的属性:
#{对象名.属性}
<bean id="a" class="com.tjetc.domain.A">
<property name="s" value="#{b.firstName}"></property>
</bean>
<bean id="b" class="com.tjetc.domain.B">
<property name="firstName" value="张"></property>
<property name="lastName" value="无忌"></property>
</bean>
4.使用类的静态变量
#{T(类的全路径名).静态变量名}
<bean id="a" class="com.tjetc.domain.A">
<property name="d" value="#{T(java.lang.Math).PI}"></property>
</bean>
5.使用类的方法
#{T(类的全路径名).方法名(参数)}
<bean id="a" class="com.tjetc.domain.A">
<property name="d" value="#{T(java.lang.Math).max(3.1,12.3)}"></property>
</bean>
6.加号还可以用作字符串连接
<bean id="a" class="com.tjetc.domain.A">
<property name="s" value="#{b.firstName+' '+b.lastName}"></property>
</bean>
7.使用类的非静态方法
#{bean的id.方法名(参数)}
<bean id="a" class="com.tjetc.domain.A">
<property name="i" value="#{b.sum()}"></property>
</bean>
public int sum() {
return 10+20;
}
(五)运算符:
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.比较运算符:
<!-- 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.逻辑运算符:
<!-- 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.三目运算符:
<!-- 真 -->
<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}'}" />