例子:
package com.mxsm.spring.spel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import com.mxsm.spring.spel.bean.InventorB;
import com.mxsm.spring.spel.bean.PlaceOfBirth;
import com.mxsm.spring.spel.bean.Society;
public class SpringSpelCollection {
@SuppressWarnings("unchecked")
@Test
public void testSpelCollection(){
String[] inventions = new String[]{"aaa","bbbb","cccc","ddddd"};
PlaceOfBirth pl = new PlaceOfBirth("guangzhou", "China");
InventorB b = new InventorB("mxsm", "China");
b.setPlaceOfBirth(pl);
b.setInventions(inventions);
Society so = new Society();
@SuppressWarnings("rawtypes")
Map map = new HashMap();
map.put("a", "aaa");
so.setOfficers(map);
List<InventorB> listinventor = new ArrayList<InventorB>();
listinventor.add(b);
so.setMembers(listinventor);
EvaluationContext context = new StandardEvaluationContext(b);
EvaluationContext societycontext = new StandardEvaluationContext(so);
ExpressionParser parse = new SpelExpressionParser();
Expression exp = null;
exp = parse.parseExpression("birthdate.Year");
System.out.println(exp.getValue(context, Integer.class));
exp = parse.parseExpression("PlaceOfBirth.city");
System.out.println(exp.getValue(context,String.class));
// evaluates to "Induction motor"
String invention = parse.parseExpression("inventions[1]").getValue(context, String.class);
System.out.println(invention);
String name = parse.parseExpression("Members[0].name").getValue(societycontext, String.class);
System.out.println(name);
String invention_1 = parse.parseExpression("Members[0].inventions[3]").getValue(societycontext, String.class);
System.out.println(invention_1);
String mapstring = parse.parseExpression("Officers['a']").getValue(societycontext, String.class);
System.out.println(mapstring);
}
/**
* List 测试
*/
@Test
public void inlineList(){
InLineList list = new InLineList();
EvaluationContext context = new StandardEvaluationContext(list);
ExpressionParser p = new SpelExpressionParser();
@SuppressWarnings("rawtypes")
List intlist = (List)p.parseExpression("{1,2,3}").getValue(context);
System.out.println(intlist);
System.out.println(list.list);
@SuppressWarnings("rawtypes")
List stringList = (List)p.parseExpression("{{'1','e'},{'r','p'}}").getValue();
System.out.println(stringList);
p.parseExpression("list").setValue(context, stringList);
System.out.println(list.list);
}
class InLineList{
@SuppressWarnings("rawtypes")
public List list = new ArrayList();
}
}
运行inlineList()方法的测试结果
总结:当你定义一个类
InLineList list = new InLineList();
EvaluationContext context = new StandardEvaluationContext(list);
然后进行解析的时候相当于类的内部对于操作人员都是透明的。
p.parseExpression("list").setValue(context, stringList);
直接拿到list对该变量进行赋值。
(更多的测试案例关注:https://github.com/mxsm SpEL的例子关注src.spel文件夹下面的代码)