Spring框架研究總結之SpEL
在Spring3以後,引入了強大的表達式語言-Spring Expression Language,即SpEL語言。SpEL能夠在運行時構建複雜的表達式,存取對象屬性,對象方法及正則表達式匹配等功能,並且其都支持XML和註解兩種實現方式,其語法格式爲#{SpEL Expression},並需要spring-expression這個jar包。
l 實例引用
l 方法調用
l 正則匹配
l 集合操作
本篇文章會以多個例子來介紹上面的幾個功能點,並且都以註解形式實現,對於XML方式這裏不做介紹,具體如下所示:
1、實例引用
該部分介紹的是如何在一個類中引用另一個類,以及該類的屬性操作,具體如下操作:
A、Bean準備
SpelBean類:
@Component("spelBean")
public class SpelBean {
@Value("#{message}")
private Message msg;
@Value("#{message.tip}")
private String tip;
public Message getMsg() {
return msg;
}
public void setMsg(Message msg){
this.msg = msg;
}
public String getTip() {
return tip;
}
public void setTip(String tip){
this.tip = tip;
}
@Override
public String toString() {
return "SpelBean [msg="+ msg + ", tip=" + tip + "]";
}
}
Message類:
@Component("message")
public class Message {
@Value("Welcome ")
private String tip;
@Value("Hello SpEL")
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg){
this.msg = msg;
}
public String getTip() {
return tip;
}
public void setTip(String tip){
this.tip = tip;
}
}
B、XML準備
這裏的配置只負責上面兩個Bean的定義和實例化,內容如下:
<beanid="message" class="com.spring.el.bean.Message" >
<property name="tip" value="Welcome" />
<property name="msg" value="HelloSpEL" />
</bean>
<bean id="spelBean" class="com.spring.el.bean.SpelBean">
<property name="tip" value="#{message.tip}"/>
<property name="msg" value="#{message}"/>
</bean>
C、如何驗證
SpelBean spelBean =(SpelBean) context.getBean("spelBean");
System.out.println(spelBean);
結果顯示:
從上圖看出,SpelBean已經通過組件標誌message成功獲得Message對象以及該對象的屬性tip值,反之,Message也可以通過spelBean獲得SpelBean得實例及屬性值了。
2、方法調用
這裏演示的是如何引用另一個對象的方法,並將返回值複製自身屬性,具體的內容如下:
A、Bean準備
Customer類:
@Component("customerBean")
public class Customer {
// 調用系統的方法
@Value("#{'Jakey'.toUpperCase()}")
private String name;
// 調用自定義方法
@Value("#{priceBean.getSpecialPrice()}")
private double amount;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
public double getAmount() {
return amount;
}
public void setAmount(doubleamount) {
this.amount = amount;
}
@Override
public String toString() {
return "Customer [name="+ name + ", amount=" + amount + "]";
}
}
Price類:
@Component("priceBean")
public class Price {
// 供Customer調用的方法
public doublegetSpecialPrice() {
Random rd = new Random();
return rd.nextDouble();
}
}
B、XML準備
<context:component-scan base-package="com.spring.el"/>
注意:
我們可以不用在XML中定義每個Bean,只要在需要的類上註解Component後,Spring AOP會自動攔截並檢索到指定的組件標誌,並實例化和執行SpEL表達式,這裏檢索的包範圍爲com.spring.el,即整個項目包。此時需要使用spring-aop依賴包哦!
C、如何驗證
Customercustomer = (Customer) context.getBean("customerBean");
System.out.println(customer);
結果顯示:
由圖可知,Customer的name屬性值,是通過調用系統默認的toUpperCase方法,而amount屬性值,是通過調取Price類的getSpecialPrice方法。
3、正則匹配
這裏介紹如何在SpEL中使用正則支持(實際比較常用),具體內容如下:
A、Bean準備
Email類:
@Component("EmailBean")
public class Email {
@Value("[email protected]")
private String emailAddress;
public String getEmailAddress() {
return emailAddress;
}
public voidsetEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
}
UserInfo類:
@Component("UserInfoBean")
public class UserInfo {
// 郵箱格式校驗正則
String emailRegEx = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)"+"*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
// 數字格式校驗正則
String numsRegEx = "\\d+";
// 郵箱格式校驗,採用三元運算
@Value("#{(EmailBean.emailAddressmatches UserInfoBean.emailRegEx) == true ? EmailBean.emailAddress : '您的郵箱格式好像不對呦!'}")
private String name;
// 用戶年齡校驗,年齡須爲數字
@Value("#{(UserInfoBean.age matchesUserInfoBean.numsRegEx) == true ? UserInfoBean.age : 0}")
private int age=30;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age){
this.age = age;
}
public String getEmailRegEx() {
return emailRegEx;
}
public voidsetEmailRegEx(String emailRegEx) {
this.emailRegEx = emailRegEx;
}
public String getNumsRegEx() {
return numsRegEx;
}
public voidsetNumsRegEx(String numsRegEx) {
this.numsRegEx = numsRegEx;
}
@Override
public String toString() {
return "UserInfo[emailRegEx=" + emailRegEx + ", numsRegEx="
+ numsRegEx + ", name="+ name + ", age=" + age + "]";
}
}
B、XML準備
<context:component-scan base-package="com.spring.el"/>
C、如何驗證
UserInfo userInfo= (UserInfo) context.getBean("UserInfoBean");
System.out.println(userInfo);
結果顯示:
4、集合操作
這裏將演示如何在SpEL表達式中使用集合,獲取集合的值,那麼就以List和Map爲例說明,對於其它的集合同樣支持哦!
A、Bean準備
DataProvider類:
@Component("DataProvierBean")
public class DataProvider {
private List<String> lists;
private Map<String,String> maps;
public DataProvider() {
lists = newArrayList<String>();
maps = newHashMap<String,String>();
// 初始化測試數據
lists.add("List-test01");
lists.add("List-test02");
maps.put("Map-KEY01", "Map-VALUE01");
maps.put("Map-KEY02", "Map-VALUE02");
}
public List<String> getLists(){
return lists;
}
public voidsetLists(List<String> lists) {
this.lists = lists;
}
public Map<String, String>getMaps() {
return maps;
}
public voidsetMaps(Map<String, String> maps) {
this.maps = maps;
}
}
DataPicker類:
@Component("DataPickerBean")
public class DataPicker {
@Value("#{DataProvierBean.lists[1]}")
private String list;
@Value("#{DataProvierBean.maps['Map-KEY02']}")
private String map;
public String getList() {
return list;
}
public void setList(String list){
this.list = list;
}
public String getMap() {
return map;
}
public void setMap(String map){
this.map = map;
}
@Override
public String toString() {
return "DataPicker[list=" + list + ", map=" + map + "]";
}
}
B、XML準備
<context:component-scan base-package="com.spring.el"/>
C、如何驗證
DataPicker dataPicker= (DataPicker) context.getBean("DataPickerBean");
System.out.println(dataPicker);
結果顯示:
實際上,SpEL接觸起來比較簡單,但也很實用,其可以方便靈巧的處理各個Bean之間的操作,以及強大正則的支持等,使它的使用變得很流行!
Spring框架之SpEL就介紹到這裏,由於作者水平有限,如有問題請在評論發言或是QQ羣(245389109(新))討論,謝謝。