Sping学习之SpEL表达式

1、基本原理

1)字面值

最简单的SpEL表达式仅包含一个字面值,例如这样:5

可以在元素的value属性中使用界定符#{}将字面值装配到Bean中

 

【使用SpEL引用Bean、Properties、方法】

<property  name="instrument" value="#{piano}"/>   

等价于

<property  name="instrument" ref="piano"/>

 

除了引用Bean的属性,使用SpEL表达式还可以做到调用Bean的方法,例如:

<beanid="carll"class="com.bbp.springInAction.beans.Instrumentalist">

<propertyname="song"value="#{somgSelector.selectorSong()}"/>

bean>

 

【避免抛出空指针的办法——nul-safe存取器】

在SpEL表达式中避免抛出空指针异常的方法是使用null-safe存取器

<propertyname="song"value="#{somgSelector.selectorSong()?.toUpperCase()}"/>

即使用  ?.  替代  . 来访问toUpperCase方法。在访问右边的方法之前,该运算符会确保左边项的值不会为null,即如果selectSong方法返回null值,SpEL不在尝试调用toUpperCase方法。

 

2)操作类

在SpEL中,使用 T()  运算符会调用 类作用域的方法和常量(即静态方法和常量),通过该运算符可以访问指定类的静态方法和常量

 

<bean  id="testBean" class="com.bbp.springInAction.beans.TestBean">

<property name="multiplier"  value="#{T(java.lang.Math).PI}"/>

<property name="randomNumber"  value="#{T(java.lang.Math).random()}"/>

bean>

 

2、在SpEL值上执行操作

 

以下运算符可以用在SpEL表达式中的值上:

 Sping学习之SpEL表达式_第1张图片

 

1)使用表达式进行数值运算

<propertyname="adjustedAmount"value="#{testBean.randomNumber-20}"/>

<propertyname="circumference"value="#{2*T(java.lang.Math).PI*testBean.randomNumber}"/>

 

【说明】SpEL除了提供了所有Java支持的基础的算术运算符,它还增加了乘方运算符(^)

【注意】这里的 +运算符 除了可以执行加法运算外,还可以执行字符串连接操作。

 

2)比较值

<propertyname="equal"value="#{testBean.randomNumber==100}"/>

<propertyname="hasCapacity"value="#{testBean.randomNumberlt100}"/>

 

【说明】在Spring的配置文件中使用小于等于、大于等于符号会报错,这是因为这连个符号在xml中有特殊的含义,spel提供了文本代替的方式:

 Sping学习之SpEL表达式_第2张图片

3)逻辑表达式

 Sping学习之SpEL表达式_第3张图片

 

4)条件表达式

(1)SpEL的三元运算符

<beanid="carll" class="com.bbp.springInAction.beans.Instrumentalist">

<property   name="song"  value="#{somgSelector.selectorSong()=='TwoTigger' ?  piano:saxophone}"/>

bean>

 

5)SpEL的正则表达式

 

SpEL通过matches运算符支持表达式中的模式匹配,如果正则表达式相匹配返回true,否则返回false

 

3、在SqEL中筛选集合

 

<util:list id="cities">

<bean class="com.bbp.springInAction.beans.City"

p:name="HeFei" p:state="AnHui" p:population="121412412"/>

<bean class="com.bbp.springInAction.beans.City"

p:name="Luan" p:state="AnHui" p:population="1212312"/>

<bean class="com.bbp.springInAction.beans.City"

p:name="AnQing" p:state="AnHui" p:population="1212341"/>

<bean class="com.bbp.springInAction.beans.City"

p:name="WuHu" p:state="AnHui" p:population="1231234243"/>

<bean class="com.bbp.springInAction.beans.City"

p:name="ChuZhou" p:state="AnHui" p:population="3432434"/>

<bean class="com.bbp.springInAction.beans.City"

p:name="FuYang" p:state="AnHui" p:population="1234343535"/>

<bean class="com.bbp.springInAction.beans.City"

p:name="TongLing" p:state="AnHui" p:population="12312421"/>

util:list>

 

<bean id="listtest" class="com.bbp.springInAction.beans.TestBean">

<property name="chosenCity" value="#{cities[2]}"/>

bean>

 

<util:properties id="setting" location="classpath:setting.properties"/>

<bean id="testproperties" class="com.bbp.springInAction.beans.TestBean">

<property name="accessToken" value="#{setting[value1]}"/>

bean>

 

【查询集合】

 

  查询运算符:

.?[]

筛选出符合条件的额集合成员变量

.^[]

从集合中查出第一个符合条件的成员

.$[]

从集合中查出最后一个符合条件的成员

 

<property  name="chosenCitys" value="#{cities.?[population gt  '12312420'  andstate!='AnHui']}"/>

 

【投影集合】

投影集合是从集合的每一个成员中选择特定的属性放入到一个新的集合中。

 

投影运算符:.![]

 

<bean   id="cityname"  class="com.bbp.springInAction.beans.TestBean">

<property   name="cityName"  value="#{ cities.!['{'+name+','+state+'}']}"/>

bean>

 

 

【说明】查询运算符合投影运算符可以同时使用

<property  

name="cityName"  

value="#{ cities.?[population gt  '12312420'  andstate!='AnHui'].!['{'+name+','+state+'}']}"/>

 

 

4、SpEL表达式的使用情景

在使用传统方式很难进行装配,而使用SpEL却很简单的场景下使用。不要过多的把逻辑放在SpEL表达式中。

你可能感兴趣的:(Spring学习,Spring,Java)