从Spring 3开始引入了Spring表达式语言,它能够以一种强大而简洁的方式将值装配到Bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值。使用SpEL你可以实现超乎想象的装配效果,这是其他装配技术很难做到的。它包含了很多特性:
使用bean的ID来引用bean;
调用方法和访问对象的属性;
对值进行算术、关系和逻辑运算;
正则表达式匹配;
集合操作;
SpEL运算符
运算符类型 运算符
算术比较 +、-、*、/、%、^
比较运算 <、>、==、<=、>=、lt、gt、rq、le、ge
逻辑运算 and、or、not、|
条件运算 ?: (ternary)、?:(Elvis)
正则表达式 matches
例:
#{2*T(java.lang.Math).PI * circle.radius} //圆周长计算
#{T(java.lang.Math).PI * circle.radius^2} //圆面积计算
#{disc.title + 'by' + disc.artist} // + 是连接符
#{counter.total == 100} #{counter.total eq 100} //判断是否一致,返回true和false
#{counter.total > 100 ? "Winner" : "Loser"} //三元表达式
#{disc.title ?: 'Rattle'} //Elvis,如果是null的话结果则为Rattle
#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9._-]+\\.com'} //正则表达式
SpEL调用静态方法
T(com.alibaba.fastjson.JSONPath).read(#projectItemJsonStr, '$.projectId')
通过SpEL表达式解析JSON
@CacheEvict(cacheNames = "redis:project:cache", key = "T(com.alibaba.fastjson.JSONPath).read(#projectItemJsonStr, '$.projectId')")
public Result<?> add(String projectItemJsonStr) {
通过SpEL表达式解析JSON
Map<String, String> data = new HashMap<>();
data.put("JsonData", "{\"someData\": \"100\"}");
Expression expression = new SpelExpressionParser().parseExpression("T(com.alibaba.fastjson.JSONPath).read(get('JsonData'), '$.someData')");
StandardEvaluationContext context = new StandardEvaluationContext(data);
context.addPropertyAccessor(new JsonPropertyAccessor());
Object value = expression.getValue(context, Object.class);
System.out.println(value);