Spring Expression Language(SpEL)速查指南

2018-11-20 21:57:31 浏览数 (1)

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

0 人点赞