前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Expression Language(SpEL)速查指南

Spring Expression Language(SpEL)速查指南

作者头像
水货程序员
修改2018-11-20 21:57:31
1.8K0
修改2018-11-20 21:57:31
举报
文章被收录于专栏:javathingsjavathings

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档