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(新))讨论,谢谢。

 

 

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