Spring Expression Language

概述

在@Value和XML中使用SpEL时,需要由#{}包裹。

如果是编程解析,就不要使用#{}包裹了。


运算符
TypeOperators
算术+, -, *, /, %, ^, 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");
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独立开发大本事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值