Spring Expression Language(SpEL)速查指南
1,503 total views, 3 views today
Spring Expression Language(SpEL)是一种表达式语言。它能在运行时通过构建表达式、存取对象的属性值或者调用对象的方法等操作。
SpEL 支持如下的运算操作:
运算类型 | 操作符 |
算数运行 | +, -, *, /, %, ^, div, mod |
关系运算 | <, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge |
逻辑运算 | and, or, not, &&, ||, ! |
条件运算 | ?: |
正则表达式 | matches |
SpEL 表达式可以在注解中使用,也可以在 XML 配置文件中使用。下面例举如何在注解中使用,XML 配置文件中的使用方式,可参考其他资料。
SpEL 表达式总是以#{} 这样的形式出现,其中属性的表示可以用${} 的方式使用。
例如:#{${someProperty} + 2}
注意,表达式中可以包含属性引用,而属性引用中不可能包含表达式。
算数运算符举例:
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}") // 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; |
关系和逻辑运算符举例:
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; |
逻辑运算表达式举例:
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 3 4 5 6 7 8 |
@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; |
正则表达式举例:
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("#{someBean.someValue matches '\d+'}") // true if someValue contains only digits private boolean validNumericValue; |
访问 List 或 Map 对象的值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@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 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@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
原创文章,转载请注明出处!http://www.javathings.top/spring-expression-language(spel)速查指南/