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("Jakey@126.com")
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(新))讨论,谢谢。