简介:SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言。优点或好处是可以在运行时查询和操作数据,尤其是数组列表型数据,因此可以缩减代码量,优化代码结构。
主要用法大致有以下三种:
A、@Value的使用
//#{}内就是表达式的内容
@Value("#{表达式}")
public String arg;
B、XML中的配置运用
C、代码块中的具体使用
字面表达式支持的数据类型有以下几种:strings, numeric values (int, real, hex), boolean, 和null等。
//表达式对象初始化
ExpressionParser parser = new SpelExpressionParser();
//注意:字符串使用需在加一层单引号包括
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();
// double 类型
double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();
//输出:2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();
//布尔类型
boolean trueValue = (Boolean) parser.parseExpression("true").getValue();
//null类型
Object nullValue = parser.parseExpression("null").getValue();
执行输出结果为:
str: Hello World
double: 6.0221415E23
int: 2147483647
bool: true
null: null
2.spel表达式与集合的配合使用
//初始化
ExpressionParser parser = new SpelExpressionParser();
//输出:Integer列表
List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue();
System.out.println("list: " + numbers);
// List的元素为List
List listlOfLists = (List) parser.parseExpression("{{'a','b'},{'x','y'}}").getValue();
System.out.println("List : " + listlOfLists);
输出结果:
list: [1, 2, 3, 4]
List : [[a, b], [x, y]]
3.与map的配合使用
ExpressionParser parser = new SpelExpressionParser();
Map map = (Map) parser.parseExpression("{txt:'Nikola',dob:'10-July-1856'}").getValue();
System.out.println("map: " + map);
Map mapOfMaps =
(Map) parser.parseExpression("{txt:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}")
.getValue();
System.out.println("Map
输出结果:
map: {txt=Nikola, dob=10-July-1856}
Map
4.与数组组合使用
ExpressionParser parser = new SpelExpressionParser();
int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue();
System.out.println("array: " + JSON.toJSONString(numbers1));
// Array with initializer
int[] numbers2 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue();
System.out.println("array: " + JSON.toJSONString(numbers2));
// Multi dimensional array
int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue();
System.out.println("array: " + JSON.toJSONString(numbers3));
int[] nums = new int[]{1, 3, 5};
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("num", nums);
// 通过下标访问数组中的元素
Integer numVal = parser.parseExpression("#num[1]").getValue(context, Integer.class);
System.out.println("numVal in array: " + numVal);
输出结果:
array: [0,0,0,0]
array: [1,2,3]
array: [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
numVal in array: 3
5.表达式的配合使用
Spel支持一些Java语法中常规的比较判断,算数运算,三元表达式,类型判断,matches
正则匹配等基表表达式
ExpressionParser parser = new SpelExpressionParser();
// 运算
System.out.println("1+2= " + parser.parseExpression("1+2").getValue());
// 比较
System.out.println("1<2= " + parser.parseExpression("1<2").getValue());
System.out.println("true ? hello : false > " + parser.parseExpression("3 > 2 ? 'hello': 'false' ").getValue());
// instanceof 判断,请注意静态类,用T进行包装
System.out.println("instance : " + parser.parseExpression("'a' instanceof T(String)").getValue());
//正则表达式
System.out.println("22 是否为两位数字 :" + parser.parseExpression("22 matches '\\d{2}'").getValue());
输出结果:
1+2= 3
1<2= true
true ? hello : false > hello
instance : true
22 是否为两位数字 :true
6.变量中的相关操作
操作过程主要有以下两个步骤:
context.setVariable("person", person);
向EvaluationContext
中塞入成员变量parser.parseExpression(xxx).getValue(context)
解析SpEL表达式,context必须作为传参丢进去哦//注意事项:方法或字段不能是私有的
ExpressionParser parser = new SpelExpressionParser();
Person person = new Person("一灰灰blog", 18);
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("person", person);
String name = parser.parseExpression("#person.getName()").getValue(context, String.class);
System.out.println("variable name: " + name);
Integer age = parser.parseExpression("#person.age").getValue(context, Integer.class);
System.out.println("variable age: " + age);
输出结果:
1
2
variable name: 一灰灰blog
variable age: 18