Spring使用SpEL表达式装配Bean

Spring使用SpEL表达式装配Bean


SpEL的基本原理

SpEL表达式的首要目标是通过计算获得某个值。在计算这个数值的过程中,会使用到其他的值并会对这些值进行操作。最简单的SpEL求值是对字面值、Bean的属性或者某个类的常量进行求值。

字面值

我们可以在元素value属性中使用#{}界定符把值装配到Bean的属性中,如下

<bean id="XX" class="com.janmee.Test">
    <property name="count" value="#{5}" />
    <property name="frequency" value="#{89.4}" />
    <property name="capacity" value="#{1e4}" />
    <property name="name" value="#{'Chuck'}" />
    <property name="enable" value="#{false}" />
</bean>

引用Bean、Properties和方法

<bean id="yy" class="com.janmee.YY" />
<bean id="xx" class="com.janmee.XX">
    <property name="instrument" value="#{yy}" />
</bean>

使用Bean的引用来获得Bean的属性、方法

<bean id="yy" class="com.janmee.YY">
    <property name="song" value="Jingle Bells" />
    <property name="instrument">
        <bean class="com.janmee.Saxophone" />
    </property>
</bean>
属性:
<bean id="xx" class="com.janmee.XX">
    <property name="song" value="#{yy.song}" />
</bean>
方法:
<bean id="xx" class="com.janmee.XX">
    <property name="song" value="#{yy.getSong()}" />
</bean>

<bean id="xx" class="com.janmee.XX">
    <property name="song" value="#{yy.getSong().toUpperCase()}" />
</bean>
在SpEL中避免抛出讨厌的空指针异常(NullPointerException)的方法是使用null-safe存取器?.
在右边方法之前,该运算符会确保左边项的值不会为null
<property name="song" value="#{yy.getSong()?.toUpperCase()}" />

操作类
在SpEL中,使用T()运算符会调用类作用域的方法和常量。例如,在SpEL中使用Java的Math类,我们可以像下面的示例这样使用T()运算符:T(java.lang.Math)

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

在SpEL值上执行操作

SpEL提供了几种运算符,这些运算符可以用在SpEL表达式中的值上

  • 算数运算:+、-、*、/、&、^
  • 关系运算:<> == <= >= lt gt eq le ge
  • 逻辑运算:and or not |
  • 条件运算:?:
  • 正则表达式:matches
    当处理文本时,检查文本是否匹配某种模式有时是非常有用的。SpEL通过matches运算符支持表达式中的模式匹配。如判断一个字符串是否为有效的邮件地址。
<property name="validEmail" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.com'}" />

在SpEL中筛选集合

SpEL可以引用集合中的某个成员,就像在Java里操作一样。但是SpEL同样具有基于属性值来过滤集合成员的能力。SpEL还可以从集合的成员中提取某些属性放到一个新的集合中。如:

<util:list id="cities">
    <bean class="com.habuma.spel.cities.City" p:name="Chicago" p:population="28374498" />
    <bean class="com.habuma.spel.cities.City" p:name="Atlanta" p:population="28374498"/>
    <bean class="com.habuma.spel.cities.City" p:name="Dallas" p:population="28374498"/>
    <bean class="com.habuma.spel.cities.City" p:name="Hoston" p:population="28374498"/>
</util:list>

<property name="chosenCity" value="#{cities[2]}" />  <!--下标从0开始-->

[]运算符同样可以用来获取java.util.Map集合中的成员。如,假设City对象以其名字作为键放入Map集合中。在这种情况下,可以使用

<property name="chosenCity" value="#{cities['Chicago']}">

[]运算符的另一种用法是从java.until.Properties集合中获取值。假设我们需要通过元素在Spring中加载一个properties配置文件,如下

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

通过SpEl从settings Bean中访问一个名为twitter.accessToken的属性,如下:

<property name="accessToken" value="#{settings['twitter.accessToken']}"/>

另外Spring还为SpEL创造了两种特殊的选择属性方式:systemEnvironment和systemProperties.
systemEnvironment包含了应用程序所在机器上的所有环境变量。
systemProperties包含了java应用程序启动时所设置的所有属性。

<property name="homePath" value="#{systemEnvironment['HOME']}"/>

查询集合成员

如果从城市集合中查询人口多余100000的城市,一种实现方式是将所有的cities Bean都装配到Bean的属性中,然后再该Bean中增加过滤不符合条件的城市的逻辑。但是在SpEL中,只需使用一个查询运算符(.?[])就可以简单做到,如下:

<property name="bigCities" value="#{cities.?[population gt 100000]}" />

其他两种查询运算符:.^[]和.$[],分别是查询第一个匹配项和最后一个匹配项

投影集合

集合投影是从集合的每一个成员中选择特定的属性放入一个新的集合。SpEL的投影运算符(.![])
假设仅需要包含城市名称的一个String类型的集合,而不是City对象的集合。

<property name="cityNames" value="#{cities.![name]}" />
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值