spring boot 最佳实践(五)--SpEL

来源:互联网 发布:家用电脑是单片机吗 编辑:程序博客网 时间:2024/06/07 05:49

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

原创粉丝点击