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}") private double add;
@Value("#{'String1 ' + 'string2'}") private String addString;
@Value("#{20 - 1}") private double subtract;
@Value("#{10 * 2}") private double multiply;
@Value("#{36 / 2}") private double divide;
@Value("#{36 div 2}") private double divideAlphabetic;
@Value("#{37 % 10}") private double modulo;
@Value("#{37 mod 10}") private double moduloAlphabetic;
@Value("#{2 ^ 9}") private double powerOf;
@Value("#{(2 + 2) * 2 + 9}") 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}") private boolean equal;
@Value("#{1 eq 1}") private boolean equalAlphabetic;
@Value("#{1 != 1}") private boolean notEqual;
@Value("#{1 ne 1}") private boolean notEqualAlphabetic;
@Value("#{1 < 1}") private boolean lessThan;
@Value("#{1 lt 1}") private boolean lessThanAlphabetic;
@Value("#{1 <= 1}") private boolean lessThanOrEqual;
@Value("#{1 le 1}") private boolean lessThanOrEqualAlphabetic;
@Value("#{1 > 1}") private boolean greaterThan;
@Value("#{1 gt 1}") private boolean greaterThanAlphabetic;
@Value("#{1 >= 1}") private boolean greaterThanOrEqual;
@Value("#{1 ge 1}") 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}") private boolean and;
@Value("#{250 > 200 and 200 < 4000}") private boolean andAlphabetic;
@Value("#{400 > 300 || 150 < 100}") private boolean or;
@Value("#{400 > 300 or 150 < 100}") private boolean orAlphabetic;
@Value("#{!true}") private boolean not;
@Value("#{not true}") private boolean notAlphabetic;
|
三元运算符
1 2
| @Value("#{2 > 1 ? 'a' : 'b'}") 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+' }") private boolean validNumericStringResult;
@Value("#{'100fghdjf' matches '\\d+' }") private boolean invalidNumericStringResult;
@Value("#{'valid alphabetic string' matches '[a-zA-Z\\s]+' }") private boolean validAlphabeticStringResult;
@Value("#{'invalid alphabetic string #$1' matches '[a-zA-Z\\s]+' }") private boolean invalidAlphabeticStringResult;
@Value("#{worker.id matches '\\d+'}") 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();
|