Spring框架研究總結之SpEL

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(新))討論,謝謝。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章