(笔记)Spring实战_装配Bean(3)_使用表达式装配

SpEL是一种强大、简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean的属性或构造器参数中。
1.SpEL的基本原理
字面值
#{}标记会提示Spring这个标记里的内容是SpEL表达式。
整型
<property name="message" value="The value is #{5}" />
浮点型
<property name="frequency" value="#{89.7}" />
String类型的字面值可以使用单引号或双引号作为字符串的界定符
<property name="name" value="#{'Chunk'}" />
<property name="name" value='#{"Chunk"}' />
布尔型
<property name="enabled" value="#{false}" />
引入Bean、Properties和方法
通过ID引入其他Bean
<property name="instrument" value="#{saxophone}" />
使用Bean的引用来获取Bean的属性

    <bean id="carl" class="com.springinaction.springidol.Instrumentalist">
        <property name="song" value="#{kenny.song}" />
        <property name="instrument" ref="saxophone" />
    </bean>

注:

    public String getSong()
    {
        return song;
    }

使用Bean的引用来调用Bean的方法
<property name="song" value="#{songSelector.selectSong()}" />
调用toUpperCase()方法
<property name="song" value="#{songSelector.selectSong().toUpperCase()}" />
避免抛出空指针异常(NullPointerException):使用.?运算符代替.来访问toUpperCase()方法。如果selectSong()返回null值,SpEL不再尝试调用toUpperCase()方法。
<property name="song" value="#{songSelector.selectSong()?.toUpperCase()}" />
操作类
在SpEL中,使用T()运算符会调用类作用域的方法和常量。
T(java.lang.Math)会返回一个java.lang.Math的类对象。
<property name="multiplier" value="#{T(java.lang.Math).PI}" />
<property name="multiplier" value="#{T(java.lang.Math).random()}" />
2.在SpEL值上执行操作

运算符类型运算符
算术运算+、-、*、/、%、^(乘方)
关系运算<、>、==、<=、>=、lt、gt、eq、le、ge
逻辑运算and、or、not(!)
条件运算?:(ternary)、?:(Elvis)
正则表达式matches

使用SpEL进行数值运算
<property name="adjustedAmount" value="#{counter.total + 42}" />
<property name="circumference" value="#{2 * T(java.lang.Match).PI * circle.radius}" />
<property name="circumference" value="#{T(java.lang.Match).PI * circle.radius ^ 2}" />
+运算符还可以执行字符串连接
<property name="fullName" value="#{performer.firstName + ' ' + performer.lastName}" />
比较值
<property name="equal" value="#{counter.total == 100}" />
<、>、<=、>=在XML中有特殊的含义,最好使用lt、gt、le、ge替代。
逻辑表达式
<property name="largeCircle" value="#{shape.kind == 'circle' and shape.perimeter gt 1000}" />
<property name="outOfStock" value="#{!product.available}" />
条件表达式
<property name="instrument" value="#{songSelector.selectSong() == 'Jingle Bells' ? piano : saxopheone}" />
一个常见的三元运算符使用场景是检查一个值是否为null。
<property name="song" value="#{kenny.song != null ? kenny.song : 'Greensleeves'}" />
三元运算符的变体
<property name="song" value="#{kenny.song ?: 'Greensleeves'}" />
SpEL的正则表达式
<property name="validEmail" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.com'}" />
2.在SpEL中筛选集合

    <util:list id="cities">
        <bean class="com.springinaction.springidol.City" p:name="Chicago"
            p:state="IL" p:population="2853114" />
        <bean class="com.springinaction.springidol.City" p:name="Atlanta"
            p:state="GA" p:population="537958" />
        <bean class="com.springinaction.springidol.City" p:name="Dallas"
            p:state="TX" p:population="1279910" />
        <bean class="com.springinaction.springidol.City" p:name="Houston"
            p:state="TX" p:population="2242193" />
    </util:list>

<util:list>元素是有Spring的util命名空间所定义的。它创建了一个java.util.List类型的Bean。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<!-- bean definitions here -->

</beans>

访问集合成员
从集合中提取一个成员
<property name="chosenCity" value="#{cities[2]}" />
随机选择一个city
<property name="chosenCity" value="#{cities[T(java.lang.Match).random() * cities.size()]}" />
中括号([])运算符始终通过索引访问集合中的成员。[]运算符可以用来获取java.util.Map集合中的成员。
假设City对象以其名字作为键放入Map集合中
<property name="chosenCity" value="#{cities['Dallas']}" />
另一种用法是从java.util.Properties集合中获取值。
<util:properties id="settings" location="classpath:settings.properties" />
settings Bean是一个java.util.Properties类。
<property name="accessToken" value="#{settings['twitter.accessToken']}" />
Spring还为SpEL创造了两种特殊的选择属性的方式:systemEnvironment和systemProperties。systemEnvironment包含了应用程序所在机器上的所有环境变量。systemProperties包含了Java应用程序启动时所设置的所有属性。
查询集合成员
查询运算符(.?[])
<property name="bigCities" value="#{cities.?[population gt 1000000]}" />
查询运算符会创建一个新的集合,新的集合中只存放符合中括号内的表达式的成员。
SpEL同样提供两种其他查询运算符:”.^[]”和”.$[]”,从集合中查询出第一个匹配项和最后一个匹配项。
对集合中元素的选择没有优先顺序。
投影集合
集合投影是从集合的每一个成员中选择特定的属性放入一个新的集合中。SpEL的投影运算符(.![])完全可以做到这点。
<property name="cityNames" value="#{cities.![name]}" />
投影多个属性
<property name="cityNames" value="#{cities.![name + ',' + state]}" />
对集合进行查询和投影运算
<property name="cityNames" value="#{cities.?[population gt 1000000].![name + ',' + state]}" />
我的建议是,在使用传统方式很难(甚至不可能)进行装配,而使用SpEL却很容易实现的场景下才使用SpEL。但是要小心,不要被SpEL迷住。抗拒SpEL的诱惑,不要把过多的逻辑放入SpEL表达式中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值