Spring表达式语言(简称SpEl)是一个支持查询和操作运行时对象导航图功能的强大的表达式语言. 它的语法类似于传统EL,但提供额外的功能,最出色的就是函数调用和简单字符串的模板函数,spring使用#{expression}默认来解析。

功能概述

Spring表达式支持的功能如下:

  • 文字表达式
  • 布尔和关系运算符
  • 正则表达式
  • 类表达式
  • 访问数据结构
  • 方法调用
  • 用户自定义函数,使用bean
  • 模板表达式

支持的运算符:

运算类型 操作符
算术运算 +, -, *, /, %, ^, div, mod
关系运算 <, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge
逻辑运算 and, or, not, &&,
三元运算 ?:
正则表达式 matches

简单的使用

算术运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Value("#{19 + 1}") // 20
private double add;

@Value("#{'String1 ' + 'string2'}") // "String1 string2"
private String addString;

@Value("#{20 - 1}") // 19
private double subtract;

@Value("#{10 * 2}") // 20
private double multiply;

@Value("#{36 / 2}") // 18
private double divide;

@Value("#{36 div 2}") // 18, the same as for / operator
private double divideAlphabetic;

@Value("#{37 % 10}") // 7
private double modulo;

@Value("#{37 mod 10}") // 7, the same as for % operator
private double moduloAlphabetic;

@Value("#{2 ^ 9}") // 512
private double powerOf;

@Value("#{(2 + 2) * 2 + 9}") // 17
private double brackets;

关系运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Value("#{1 == 1}") // true
private boolean equal;

@Value("#{1 eq 1}") // true
private boolean equalAlphabetic;

@Value("#{1 != 1}") // false
private boolean notEqual;

@Value("#{1 ne 1}") // false
private boolean notEqualAlphabetic;

@Value("#{1 < 1}") // false
private boolean lessThan;

@Value("#{1 lt 1}") // false
private boolean lessThanAlphabetic;

@Value("#{1 <= 1}") // true
private boolean lessThanOrEqual;

@Value("#{1 le 1}") // true
private boolean lessThanOrEqualAlphabetic;

@Value("#{1 > 1}") // false
private boolean greaterThan;

@Value("#{1 gt 1}") // false
private boolean greaterThanAlphabetic;

@Value("#{1 >= 1}") // true
private boolean greaterThanOrEqual;

@Value("#{1 ge 1}") // true
private boolean greaterThanOrEqualAlphabetic;

注意:其中的小于大于符号,主要是为了兼容xml配置的场景,xml中不支持这些特殊的字符。

逻辑运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Value("#{250 > 200 && 200 < 4000}") // true
private boolean and;

@Value("#{250 > 200 and 200 < 4000}") // true
private boolean andAlphabetic;

@Value("#{400 > 300 || 150 < 100}") // true
private boolean or;

@Value("#{400 > 300 or 150 < 100}") // true
private boolean orAlphabetic;

@Value("#{!true}") // false
private boolean not;

@Value("#{not true}") // false
private boolean notAlphabetic;

三元运算符

1
2
@Value("#{2 > 1 ? 'a' : 'b'}") // "a"
private String ternary;

if-then-else的写法,通常可以判断变量是否为空:@Value("#{conf.name!=null?conf.name:'默认值'}")
此外还有一种“Elvis”运算符,简化了上面这种“判定是否为空,为空则返回默认值”的场景:

1
2
@Value("#{conf.name ?: 'default'}")
private String elvis;

正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Value("#{'100' matches '\\d+' }") // true
private boolean validNumericStringResult;

@Value("#{'100fghdjf' matches '\\d+' }") // false
private boolean invalidNumericStringResult;

@Value("#{'valid alphabetic string' matches '[a-zA-Z\\s]+' }") // true
private boolean validAlphabeticStringResult;

@Value("#{'invalid alphabetic string #$1' matches '[a-zA-Z\\s]+' }") // false
private boolean invalidAlphabeticStringResult;

@Value("#{worker.id matches '\\d+'}") // true if someValue contains only digits
private boolean validNumericValue;

使用程序解析SpEL表达式

主要的包位于org.springframework.expression下,简单的HelloWord:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义解析器
ExpressionParser parser = new SpelExpressionParser();
// 定义表达式,简单的文字表达式
Expression exp = parser.parseExpression("'Hello World'");
// 取出值
System.out.println(exp.getValue(String.class));
double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();

// evals to 2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();

boolean trueValue = (Boolean) parser.parseExpression("true").getValue();

Object nullValue = parser.parseExpression("null").getValue();