1. 程式人生 > >Spring表示式語言——SPEL

Spring表示式語言——SPEL

Spring表示式語言(Spring Expression Language 簡寫SpEL)是類似於OGNL和JSF EL的表示式語言, 能夠在執行時構建複雜表示式, 存取物件屬性、呼叫方法等。所有的SpEL都支援XML和Annotation兩種方式, 使用的格式為:#{SpEL expression}。

用在xml上的例子:
通常情況,在欄位要引用外部的bean時,我們都使用ref屬性指明外部bean的id:

<bean id="cellphonesender" class="twm.spring.start.NotifyServiceByCellPhoneImpl" />  
<bean id="order" class="twm.spring.start.Order">
     <property name="notifyservice" ref="cellphonesender"></property>
</bean>

但是我們如果使用el表示式的話,這裡同樣可以用value屬性。

<bean id="order" class="twm.spring.start.Order">
     <property name="notifyservice" value="#{cellphonesender}"></property> 
</bean>

用在註解上:

public class Test {
    @Value("#{'Messi'.toUpperCase()}")
    private String name;
}

在java程式中,我們可以使用ExpressionParser

類來解析SpEL字串:

// 1. 構建解析器
ExpressionParser parser = new SpelExpressionParser();
// 2. 解析表示式
Expression exp = parser.parseExpression("'Messi'.toUpperCase()");
// 3. 獲取結果
exp.getValue();

看一些常用的el用法(下面都以註解方式舉例,只要關心表示式字串的內容就行):

一、引用bean:

@Value("#{customer}")

二、屬性和方法呼叫

@Value("#{customer.name}")

@Value("#{‘Messi’.toUpperCase()}");

@Value("#{userBean.getUserLocation()}");

呼叫靜態屬性與方法(使用運算子T())
@Value("#{T(java.lang.Math).random}")
@Value("#{T(java.lang.Math).PI}")

三、SpEL 操作符

1.關係操作符,包括:等於 (==, eq),不等於 (!=, ne),小於 (<, lt),,小於等於(<= , le),大於(>, gt),大於等於 (>=, ge)
2.邏輯操作符,包括:and,or,and not(!)
3.數學操作符,包括:加 (+),減 (-),乘 (*),除 (/),取模 (%),冪指數 (^)。

@Value("#{1>=1 and 6>(10/2)}")
private boolean testbool;//true
注意這裡,因為表示式中出現了xml敏感的符號,比如”<”,”>”,”/”等,當生成XML時,會破壞了XML結構,使資料中斷。所以如果在 xml寫表示式的話,要注意用轉義字元或使用<![CDATA[ ]]>

<bean id="order" class="twm.spring.start.Order">
     <property name="testbool" value="#{1 &ge; 1 and 6 &gt; (10/2)}"></property> 
</bean>

四、集合取值

@Value("#{testBean.map[‘MapA’]}")
private String mapA;

@Value("#{testBean.list[0]}")
private String list;