概述
在@Value和XML中使用SpEL时,需要由#{}包裹。
如果是编程解析,就不要使用#{}包裹了。
运算符
Type | Operators |
---|---|
算术 | +, -, *, /, %, ^, div, mod |
比较 | <, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge |
逻辑 | and, or, not, &&, ||, ! |
条件 | ?: |
正则 | matches |
引用属性
#{${someProperty} + 2}
算术运算
@Value("#{2 ^ 9}") // 乘方运算: 512
private double powerOf;
@Value("#{36 div 2}") // 除法,相当于 /
private double divideAlphabetic;
@Value("#{37 mod 10}") // 取模,相当于 %
private double moduloAlphabetic;
@Value("#{'String1 ' + 'string2'}") // 字符串合并
private String addString;
@Value("#{(2 + 2) * 2 + 9}") // 复杂运算
private double brackets;
比较运算
@Value("#{1 < 1}") // false
private boolean lessThan;
@Value("#{1 lt 1}") // false
private boolean lessThanAlphabetic;
逻辑运算
@Value("#{250 > 200 && 200 < 4000}") // true
private boolean and;
@Value("#{250 > 200 and 200 < 4000}") // true
private boolean andAlphabetic;
条件运算
@Value("#{2 > 1 ? 'a' : 'b'}") // "a"
private String ternary;
@Value("#{someBean.someProperty != null ? someBean.someProperty : 'default'}")
private String ternary;
// 注意下面这种写法: someBean.someProperty为null时取'default'
@Value("#{someBean.someProperty ?: 'default'}")
private String elvis;
正则表达式
@Value("#{'100' matches '\\d+' }") // true
private boolean validNumericStringResult;
@Value("#{someBean.someValue matches '\d+'}")
private boolean validNumericValue;
访问List和Map
@Value("#{workersHolder.salaryByWorkers['John']}") // 35000
private Integer johnSalary;
@Value("#{workersHolder.workers[3]}") // George
private String lastWorker;
编程解析
ExpressionParser
ExpressionParser只是解析一个表达式字符串,得到Expression对象。Expression本身需要在一个EvaluationContext下才求出具体的值。
在没有EvaluationContext的情况下,表达式只能用具体的值。比如:
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("'Any string'");
String result = (String) expression.getValue();
在有EvaluationContext的情况下,使用方法如下:
Car car = new Car();
car.setMake("Good manufacturer");
car.setModel("Model 3");
car.setYearOfProduction(2014);
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("model");
EvaluationContext context = new StandardEvaluationContext(car);
String result = (String) expression.getValue(context);
StandardEvaluationContext的创建是比较昂贵的,最好缓存使用。
还有直接使用对象当上下文的:
Expression expression = expressionParser.parseExpression("model");
String result = (String) expression.getValue(car);
取值时可以指定类型:
Expression expression = expressionParser.parseExpression("yearOfProduction > 2005");
boolean result = expression.getValue(car, Boolean.class);
ExpressionParser设值
ExpressionParser expressionParser = new SpelExpressionParser();
expressionParser.parseExpression("cars[0].model").setValue(context, "Other model");