Spring Expression Language(SpEL)是一种表达式语言。它能在运行时通过构建表达式、存取对象的属性值或者调用对象的方法等操作。
SpEL 支持如下的运算操作:
运算类型 | 操作符 |
---|---|
算数运行 | , -, *, /, %, ^, div, mod |
关系运算 | <, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge |
逻辑运算 | and, or, not, &&, ||, ! |
条件运算 | ?: |
正则表达式 | matches |
SpEL 表达式可以在注解中使用,也可以在 XML 配置文件中使用。下面例举如何在注解中使用,XML 配置文件中的使用方式,可参考其他资料。
SpEL 表达式总是以#{} 这样的形式出现,其中属性的表示可以用${} 的方式使用。
例如:#{${someProperty} 2}
注意,表达式中可以包含属性引用,而属性引用中不可能包含表达式。
算数运算符举例:
代码语言:javascript复制@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}") // 19
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;
关系和逻辑运算符举例:
代码语言:javascript复制@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;
逻辑运算表达式举例:
代码语言:javascript复制@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;
条件运算符
代码语言:javascript复制@Value("#{2 > 1 ? 'a' : 'b'}") // "a"
private String ternary;
@Value("#{someBean.someProperty != null ? someBean.someProperty : 'default'}")
private String ternary;
@Value("#{someBean.someProperty ?: 'default'}") // Will inject provided string if someProperty is null
private String elvis;
正则表达式举例:
代码语言:javascript复制@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("#{someBean.someValue matches 'd '}") // true if someValue contains only digits
private boolean validNumericValue;
访问 List 或 Map 对象的值:
代码语言:javascript复制@Component("workersHolder")
public class WorkersHolder {
private List<String> workers = new LinkedList<>();
private Map<String, Integer> salaryByWorkers = new HashMap<>();
public WorkersHolder() {
workers.add("John");
workers.add("Susie");
workers.add("Alex");
workers.add("George");
salaryByWorkers.put("John", 35000);
salaryByWorkers.put("Susie", 47000);
salaryByWorkers.put("Alex", 12000);
salaryByWorkers.put("George", 14000);
}
//Getters and setters
}
访问集合的值
代码语言:javascript复制@Value("#{workersHolder.salaryByWorkers['John']}") // 35000
private Integer johnSalary;
@Value("#{workersHolder.salaryByWorkers['George']}") // 14000
private Integer georgeSalary;
@Value("#{workersHolder.salaryByWorkers['Susie']}") // 47000
private Integer susieSalary;
@Value("#{workersHolder.workers[0]}") // John
private String firstWorker;
@Value("#{workersHolder.workers[3]}") // George
private String lastWorker;
@Value("#{workersHolder.workers.size()}") // 4
private Integer numberOfWorkers;
SpEL 可以通过编程实现表达式解析,只需要使用 SpelExpressionParser 类。这里不做介绍,可参考官方文档。
参考:https://www.baeldung.com/spring-expression-language