首页 » java

spring boot SpEL

   发表于:java评论 ()   热度:397

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・。)
喜欢这篇文章吗?欢迎分享到你的微博、QQ群,并关注我们的微博,谢谢支持。