Spring实战学习笔记之SpEL表达式
在Spring XML配置⽂件中装配Bean的属性和构造参数都是静态的,⽽在运⾏期才知道装配的值,就可以使⽤SpEL实现
SpEL表达式的⾸要⽬标是通过计算获得某个值。在计算这个数值的过程中,会使⽤到其他的值并会对这些值进⾏操作。
SpEL特性:(1)、使⽤Bean的ID来引⽤Bean;(2)、调⽤⽅法和访问对象的属性;(3)、对值进⾏算术、关系和逻辑运算;(4)、正则表达式匹配;(5)、集合操作
#{ }标记会提⽰ Spring这个标记⾥的内容是SpEL表达式。
最简单的属性注⼊:<property name="count" value="#{5}" />
还可以与⾮SpEL表达式的值混⽤:<property name="message" value="The value is #{5}" />
浮点数value="#{89.7}"        科学记数法value="#{1e4}"=====>10000.0
String类型的字⾯值:<property name="name" value="#{'Tom'}" />或<property name="name" value='#{"Tom"}' />    单引号和双引号相互包含的⽅式使⽤
布尔类型:<property name="enable" value="#{false}" />
引⽤Bean:<property name="userDao" value="#{userDao}" />等价于<property name="userDao" ref="userDao" />
引⽤Bean属性:<property name="orderOwner" value="#{user.name}" />类似代码:User user=new
User();order.Name());
引⽤Bean的⽅法:<property name="currUser" value="#{CurrUser()}" />(假设userDao内有公共⽅法getCurrUser())现在如果想把CurrUser()得到的当前英⽂⽤户名转为⼤写字母:<property name="currUser" value="# {CurrUser().toUpperCase()}" />,这时如果得到的⽤户名为空(null),则会抛NullPointerException异常,为了避免异常,可以使⽤?.代替点(.),如:<property name="currUser" value="#{CurrUser()?.toUpperCase()}" />这样null后⾯的⽅法不再执⾏
SpEL表达式中使⽤T( )运算符访问指定类的静态⽅法和常量。
如引⽤Math类的PI常量:<property name="pi" value="#{T(java.lang.Math).PI}" />
如调⽤Math类的random静态⽅法:<property name="randomNumber" value="#{T(java.lang.Math).random()}" />使⽤SpEL进⾏数值运算:
加法:<property name="adjustedAmount" value="#{al+42}" />(把counter Bean的total属性值与42相加,注意+运算符两边必须是数字型)
其他减、乘、整除、求余运算符类似。
使⽤SpEL进⾏⽐较和逻辑表达式运算时,会将得到的布尔型(true或false)赋值给属性,注意,⽐较运算符的<、<=、>、>=这些符号含有<、>,在XML中有特殊意义,故使⽤中需要⽤⽂本替代⽅式。==对应eq、<;对应lt、<=对应le、>对应gt、>=对应ge ⽐较运算符:<property name="equal" value="#{al==100}" />
逻辑表达式(and 、or 、not或!):<property name="largeCircle" value="#{shape.kind=='circle' and shape.perimeter gt 10000}" />
条件表达式(使⽤三元运算符? : ):<property name="song" value="#{kenny.song != null ? kenny.song : 'Greensleeves'}" />
上述条件表达式中kenny.song有重复,可以简化写:<property name="song" value="#{kenny.song ? : '
Greensleeves'}" />
正则表达式:<property name="validEmail" value="#{ail matches '/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-
]+)+$/'}" />
在SpEL中筛选集合
假设有个City类,属性有name、state、population
在Spring XML中引⼊util命名空间,定义⼀个<util:list>集合
<util:list id="cities">
<bean class="Class.City">
<property name="name" value="Chicago"></property>
<property name="state" value="IL"></property>
<property name="population" value="2853114"></property>
</bean>
<bean class="Class.City">
<property name="name" value="Atlanta"></property>
<property name="state" value="GA"></property>
<property name="population" value="537958"></property>
</bean>
<bean class="Class.City">
<property name="name" value="Dallas"></property>
<property name="state" value="TX"></property>
<property name="population" value="1279910"></property>
</bean>
<bean class="Class.City">
<property name="name" value="Houston"></property>
<property name="state" value="TX"></property>
<property name="population" value="2242193"></property>
</bean>
<bean class="Class.City">
<property name="name" value="Jal"></property>
spring framework表达式assign<property name="state" value="NM"></property>
<property name="population" value="1996"></property>
</bean>
</util:list>
访问集合成员:<property name="chosenCity" value="#{cities[2]}" /> 选出集合中第三个City
<property name="chosenCity" value="#{cities[T(java.lang.Math).random()*cities.size()]}" />结合SpEL表达式其他⽅法
[]运算符也可以获取java.util.Map集合中成员,假设City是Map集合:<property name="chosenCity" value="#{cities['Dallas']}" />从java.util.Properties集合中取值,通过<util:properties>元素加载properties配置⽂件,假设⽂件有内容
twitter.accessToken=aadkeudnfsje233sdjfs。获取⽅式:<property name="chosenCity" value="#{settings['twitter.accessToken']}" />
Spring还为SpEL创造了两种特殊的选择属性⽅式:systemEnvironment和systemProperties
systemEnvironment包含了应⽤程序所在机器上的所有环境变量(其实是⼀个java.util.Properties集合),如获取JAVA_HOME路径:<property name="homePath" value="#{systemEnvironment['JAVA_HOME']}" />
systemProperties包含了java应⽤程序启动时所设置的所有属性(通常通⽤-D参数)。因此。如果使⽤-
Dapplication.home=/etc/myapp,来启动JVM,那么通过SpEL获取:<property name="homePath" value="#
{systemProperties['application.home']}" />
使⽤SpEL获取字符串某字符:'This is a test'[3]
查询集合成员:
<property name="bigCities" value="#{cities.?[population gt 100000]}" />得到⼈⼝⼤于100000的城市集合
<property name="aBigCities" value="#{cities.^[population gt 100000]}" />得到⼈⼝⼤于100000的第⼀个符合条件的⼤城市
<property name="bigCities" value="#{cities.$[population gt 100000]}" />得到⼈⼝⼤于100000的最后⼀个符合条件的⼤城市投影集合:从集合中选取每个成员的属性放⼊⼀个新的集合中,使⽤.![]运算符
<property name="cityNames" value="#{cities.![name]}" /> 得到城市的名字并赋予String类型集合
<property name="cityNames" value="#{cities.![name + ', '  + state]}" />属性拼接,得到如"Chicago,IL"、"Atlanta,GA"、等数据集合注意:在传统⽅式难以实现的情况下可以考虑使⽤SpEL,不要把过多逻辑放⼊SpEL表达式中

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。