最简单的SpEL表达式仅包含一个字面值,例如这样:5
可以在
【使用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方法。
在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>
以下运算符可以用在SpEL表达式中的值上:
<propertyname="adjustedAmount"value="#{testBean.randomNumber-20}"/>
<propertyname="circumference"value="#{2*T(java.lang.Math).PI*testBean.randomNumber}"/>
【说明】SpEL除了提供了所有Java支持的基础的算术运算符,它还增加了乘方运算符(^)
【注意】这里的 +运算符 除了可以执行加法运算外,还可以执行字符串连接操作。
<propertyname="equal"value="#{testBean.randomNumber==100}"/>
<propertyname="hasCapacity"value="#{testBean.randomNumberlt100}"/>
【说明】在Spring的配置文件中使用小于等于、大于等于符号会报错,这是因为这连个符号在xml中有特殊的含义,spel提供了文本代替的方式:
(1)SpEL的三元运算符
<beanid="carll" class="com.bbp.springInAction.beans.Instrumentalist">
<property name="song" value="#{somgSelector.selectorSong()=='TwoTigger' ? piano:saxophone}"/>
bean>
SpEL通过matches运算符支持表达式中的模式匹配,如果正则表达式相匹配返回true,否则返回false
<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+'}']}"/>
在使用传统方式很难进行装配,而使用SpEL却很简单的场景下使用。不要过多的把逻辑放在SpEL表达式中。