首页 > 代码库 > Spring实战笔记3---使用表达式

Spring实战笔记3---使用表达式

如果用过jsp表达式的人见到Spring表达是,第一反应一定会是:奥,原来是它呀(应该有不同的版本)。Spring表达式和jsp的表达式是大同小异,只要之前接触过jsp表达式,那么学习Spring的表达式那就是非常容易的事情了。

首先来说一下Spring表达式的一些特性,也可以说成是一些用法:

*使用Bean的id来引用Bean;

*调用方法和访问对象的属性;

*对值进行算数、关系和逻辑运算;

*正则表达式匹配

*集合操作


Spring表达式(SpEL)使用#()来标记的(jsp是使用$()),在一对括号中可以使用SpEL来进行一些处理,多一半的处理是在装配Bean的时候用的,

字面值

字面值就是我们所谓的常量,可以使用SpEL表达式来表示一个常量,比如说这里我表示了一个字面值5,那么使用SpEL表达式就是#(5),可以随便指定字面值的类型,字符串或者浮点数,如果要表示复杂类型的话,就需要下面更复杂的一些用法了

引用Bean、Properties和方法

我们所写的SpEL基本上多事写在xml配置文件当中的,也就是装配Bean的配置文件当中,所以本篇记录的也都是在配置文件当中的用法,那么如何引用一个Bean呢,看如下代码

	<bean id="saxophone" class="com.springframework.springidol.Saxophone"/>
	
	<bean id="instrumentlist" class="com.springframework.springidol.InstrumentList">
		<property name="instrument" value=http://www.mamicode.com/"#(saxophone)">>在instrumentlist中配置instrument属性的时候使用了SpEL表达式,我们可以使用SpEL引用一个已经在上下文文件中已经声明好的Bean的id,同样我们可以在SpEL表达式中像操作java对象一样来操作Bean引用,可以调用期中的属性以及方法,但是如果是方法的话该方法应该有返回值,而且返回值的类型最好和要装配它的属性的类型是一样的。看如下代码

<property name="instrumentName" value=http://www.mamicode.com/"#(saxophone.name)">>以上两条语句的效果是一样的这里使用了#(saxophone.name)和#(saxophone.getName())两种方式或的saxophone的name属性,一个是直接引用,一个是调用对象中的方法获得。如果我们增加一个需求,就是通过调用方法来返回的name属性返回值必须是大写,实现方法如下代码

<property name="instrumentName" value=http://www.mamicode.com/"#(saxophone.getName().toUpperCase())">
这样在取到name属性的时候再调用一个toUpperCase()方法把所有字幕都转换成大写,在把值赋给instrument属性,这里会引发一个小问题,如果通过getName方法返回回来的值是null的话,那么就会有一个空指针异常抛出,如何在表达式中避免抛出空指针异常呢,方法是用null-safe存取器;

<property name="instrumentName" value=http://www.mamicode.com/"#(saxophone.getName()?.toUpperCase())">

使用(?.)来代替(.)来访问toUpperCase()方法,在访问getName方法的时候SpEL会判断返回回来的值是否是null,如果是null,那么就不再调用toUpperCase()方法了


操作类

在spEL表达式中使用T() 运算符调用类作用域的方法和常量看如下代码

T(java.lang.Math)
下面的一个例子是需要把PI设置到Bean的一个属性中去和把一个随机数设置到Bean的属性中去

<property name="pi" value=http://www.mamicode.com/"#{T(java.lang.Math).PI}">>

spEL表达式的几种运算

以下表格是spEL表达式所支持的运算符


spEL表达式支持的运算符
运算符类型运算符
关系运算<,>,==,<=>=,lt,gt,eq,le,ge
逻辑运算and,or,not,!
条件运算?:(ternary),?:(Elvis)
算数运算+,-,*,/,%,^
正则表达式matches



spEL的比关系运算符
运算符符号文本类型
等于==eq
小于<lt
小于等于<=le
大于>gt
大于等于>=ge


条件表达式


在spEL中条件表达式分为两种,一种是,普通的三元运算,一种是省略了判断null的条件判断,看如下代码示例

<property name="instrument" value=http://www.mamicode.com/"#{songSelector.selectSong()=='Jingle Bells' ? piano : saxophone}" />

在这个示例中,如果选择的歌曲名为“Jingle Bells” 一个piano的引用将配置到该属性当中,否则一个id为saxophoone的Bean将装配到该属性当中。

这是一个普通的三元运算,和java当中的用法一样,下面这个例子,是为了简化判断一个属性是否为null而设计的,请看如下代码

<property name="song" value=http://www.mamicode.com/"#{kenny.song!=null?kenny.song:'Greensleeves'}"/>>
以上这两种方式是等价的,运算符?:可以自动判断kenny.song 这个属性是否为null,如果等于null ,那么就该属性的值就是后边定义的字符串,如果不等于null那么该属性的值就等于kenny.song



一般我们在使用Spring的时候,很少在配置文件中使用SpEL,不到万不得已的时候不会选择表达式,因为这会让配置文件中加入有关逻辑代码,对于开发来说不利。


spEL表达式中还包含结合筛选的操作,比较复杂,等到用到的时候再开个blog介绍一下。

Spring实战笔记3---使用表达式