spring boot SpEL
SpEL 拥有许多特性,包括:
表达式语言支持以下功能
- 文字表达式
- 引用Bean属性和方法
- 类表达式
- 访问 properties, arrays, lists, maps
- 布尔和关系运算符
- 正则表达式
- 方法调用
- 关系运算符
- 参数
- 调用构造函数
- 构造Array
- 内嵌lists
- 内嵌maps
- 三元运算符
- 变量
- 用户定义的函数
- 集合投影
- 集合筛选
- 模板表达式
基本语法
#{ } 标记会提示Spring 这个标记里的内容是SpEL表达式。
#{rootBean.nestBean.propertiy} “.”操作符表示属性或方法引用,支持层次调用
#{aList[0] } 数组和列表使用方括号获得内容
#{aMap[key] } maps使用方括号获得内容
#{rootBean?.propertiy} 此处"?"是安全导航运算符器,避免空指针异常
#{condition ? trueValue : falseValue} 三元运算符(IF-THEN-ELSE)
#{valueA?:defaultValue} Elvis操作符,当valueA为空时赋值defaultValue
使用SpEL装配Bean
spring支持通过运行期执行的表达式将值装配到Bean的属性或构造器参数中。spring boot默认使用基于注解的配置,@Value注解可以在域,方法和方法/构造器参数中使用来指定一个默认值。
//import org.springframework.beans.factory.annotation.Value;
@Value("#{xxxx}")
private String attribute1;
目前在配置经常使用@Value(“${xxxx}”)
其中$表示获取配置参数
1. 文字表达式
@Value("#{24}") //整型
@Value("#{'中国'}") //String
//里面有个单引号,如果去掉会报错。String 类型的字面值可以使用单引号或双引号作为字符串的界定符。
@Value("my name is #{'david'}") //与非SpEL 表达式的值混用
@Value("#{120.4}") //浮点型数字
@Value("#{true}") //布尔值
2. 引用Bean属性和方法
@Value("#{beanId}") //使用Bean ID 将一个Bean 装配到另一个Bean 的属性中
@Value("#{beanId.attribute}") //使用Bean 的引用来获取Bean 的属性
@Value("#{beanId.getSomenthing()}") //调用引用Bean的方法
3. 类表达式
SpEL使用T() 运算符调用类作用域的方法和常量。
@Value("#{T(java.lang.Math).PI}")
@Value("#{T(java.lang.Math).random()}")
@Value("#{T(java.lang.Math).random() * 100.0 }")
4. 访问 properties
spel有两个可用的预定义变量 “systemProperties” 和 “systemEnvironment”。
systemProperties — java.util.Properties对象,从运行环境中检索属性。相当于java代码System.getProperty(arg0)
systemEnvironment — java.util.Properties对象,检索运行环境的具体属性。相当于java代码System.getenv(arg0)
@Value("#{ systemProperties['user.region'] }")
@Value("#{ systemEnvironment['profile'] }")
使用Spring的表达接口求值
下面的代码使用SpEL API来解析文本字符串表达式 Hello World.
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'");
String message = (String) exp.getValue(); // "hello world"
exp = parser.parseExpression("'Hello World'.concat('!')");
message = (String) exp.getValue();// "Hello World!"
模板数据绑定
#用户评分
SCORE=auditInfo.auditInfo==null?"":auditInfo.auditInfo["score"]
#渠道号
CHANNEL_NO=auditInfo.artificialAuditInfo.channelNo
#渠道名称
CHANNEL_NAME=auditInfo.artificialAuditInfo.channelName
Map<String, Expression> expressions = new HashMap<>();
propertis.keySet().forEach(
k -> expressions.put(k, parser.parseExpression(propertis.getString(k))));
Map<String, Object> target = new HashMap<>();
expressions.keySet().forEach(key ->
target.put(key, expressions.get(key).getValue(origin))});
参考 http://itmyhome.com/spring/expressions.html
https://segmentfault.com/a/1190000012645312
https://segmentfault.com/a/1190000011014037
(。・v・。)