首页 > 代码库 > 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表达式所支持的运算符
运算符类型 | 运算符 |
---|---|
关系运算 | <,>,==,<=>=,lt,gt,eq,le,ge |
逻辑运算 | and,or,not,! |
条件运算 | ?:(ternary),?:(Elvis) |
算数运算 | +,-,*,/,%,^ |
正则表达式 | matches |
运算符 | 符号 | 文本类型 |
---|---|---|
等于 | == | 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---使用表达式