Spring表達式語言,簡稱SpEL,是一個支持運行時查詢和操作對象圖的強大的表達式語言。語法類似於EL:SpEL使用#{…}作為定界符,所有在大括號中的字符都將被認為是SpEL
SpEL為bean屬性進行動態賦值提供了便利
通過SpEL可以實現:
- 通過bean的id對bean進行引用
- 調用方法及引用對象中的屬性
- 計算表達式的值
- 正則表達式的匹配
如果我們要為基本類型或者String類型賦值,我們也可以用SpEL:
整數:<property name="count" value="#{5}">
科學計數法:<property name="capacity" value="#{1e4}">
String可以使用單引號或者雙引號作為字符創的定界符號:
<property name="name" value="#{"Tom"}">或者我們也可以這么寫:
<property name="name" value="#{'Tom'}">
布爾類型"<property name="enabled" value="#{false}" >
我們這里只是說可以用,瞅着都知道這個很麻煩(ಥ_ಥ)還不如直接賦值,大家知道有這回事就行。
當然我們也可以拿這玩意引用其他對象:
<property name="myCar" value="#{car}">這里相當於用了ref屬性
也可以用來引用其他對象的屬性,這種操作我們是無法通過普通操作完成的:
<property name="myCity" value="#{address.city}">
SpEL還可以調用其他方法,還可以鏈式操作,真的可以騷上天:
<property name="myCity" value="#{address.toString()}">
<property name="myCity" value="#{address.roString().toUpperCase()}">
其他還有很多豐富的其他功能:
- 算數運算符:+、-、*、/、%、^
- 加號還可以用作字符創鏈接
- 比較運算符<、>、==、<=、>=、lt、gt、eq、le、ge
- 邏輯運算符and、or、not、|
- if-else運算符
- 正則表達式matches
- 調用靜態方法或者靜態屬性T()
可以看出SpEL是塊非常龐大的內容,我們需要花很久才能將它真正掌握,這里我就提一些比較常用的功能。
先做一下准備工作,先寫一下新的JavaBean:
Car.java
-
private String brand;
-
private double price;
-
//輪胎周長
-
private double tyrePerimeter;
Person.java
-
private String name;
-
//引用address bean 的city屬性
-
private String city;
-
-
-
private Car car;
-
//根據car的price 確定info
-
//car 的price>=3000000:經理
-
//否則為白領
-
private String info;
Address.java和之前的一樣,接下來來寫配置文件beans-spel.xml
SpEL賦字面量的值
-
<bean id="address" class="com.figsprite.bean.SpEL.Address">
-
<property name="city" value="#{'上海'}"/>
-
<property name="street" value="#{'陸家嘴'}"/>
-
</bean>
SpEL 算法運算符 調用靜態屬性
-
<bean id="car" class="com.figsprite.bean.SpEL.Car">
-
<property name="brand" value="奧迪"/>
-
<property name="price" value="5000000"/>
-
<property name="tyrePerimeter" value="#{T(java.lang.Math).PI * 80}"
-
</bean>
SpEL 引用其他對象 引用其他對象屬性 if-else
-
<bean id="person" class="com.figsprite.bean.SpEL.Person">
-
<property name="car" value="#{car}"/>
-
<property name="city" value="#{address.city}"/>
-
<property name="info" value="#{car.price>3000000?'經理':'白領'}"/>
-
<property name="name" value="Tom"/>
-
</bean>
這里就存在動態賦值,如info屬性,我需要根據car.price的具體值決定info的值
