多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 简介 * spring表达式语言(简称spel):是一个支持运行时查询和操作对象图的强大的表达式语言 * 语法类似于EL:SPEL使用`#{}`作为定界符,所有在大框号中字符都将被认为是spel * spel为bean的属性进行动态赋值提供了便利 * 通过spel可以实现 - 通过bean的id对bean进行引用 - 调用方法以及引用对象中的属性 - 计算表达式的值 - 正则表达式的匹配 # 基本语法 ~~~ #{ } 标记会提示Spring 这个标记里的内容是SpEL表达式。 #{rootBean.nestBean.propertiy} “.”操作符表示属性或方法引用,支持层次调用 #{aList[0] } 数组和列表使用方括号获得内容 #{aMap[key] } maps使用方括号获得内容 #{rootBean?.propertiy} 此处"?"是安全导航运算符器,避免空指针异常 #{condition ? trueValue : falseValue} 三元运算符(IF-THEN-ELSE) #{valueA?:defaultValue} Elvis操作符,当valueA为空时赋值defaultValue ~~~ # 字面量 * 整数: `<property name="count" value="#{5}" />` * 小数: `<property name="frequency" value="#{89.7}" />` * 科学计算法: `<property name="capacity" value="#{1e4}" />` * string可以使用单引号或双引号作为字符串的定界符号 ~~~ <property name="name" value="#{'Chuck'}" /> 或 <property name="name" value='#{"Chuck"}' /> ~~~ * Boolean: `<property name="enabled" value="#{false}" />` # 引用bean,属性和方法 * 引用其他对象 ~~~ <!-- 通过value属性和spel配置bean之间的应用关系 --> <property name="prefix" value="#{prefixGenerator}"></property> ~~~ * 引用其他对象的属性 ~~~ <!-- 通过value属性和spel配置suffix属性值为另一个bean的suffix属性值 --> <property name="suffix" value="#{prefixGenerator.suffix}"></property> ~~~ * 调用其他方法,还可以进行链式调用 ~~~ <!-- 通过value属性值和spel配置suffix属性值为另一个bean的方法的返回值 --> <property name="suffix" value="#{prefixGenerator.toString()}"></property> <!-- 方法连调 --> <property name="suffix" value="#{prefixGenerator.toString().toUpperCase()}"></property> ~~~ ~~~ @Value("#{beanId}") //使用Bean ID 将一个Bean 装配到另一个Bean 的属性中 @Value("#{beanId.attribute}") //使用Bean 的引用来获取Bean 的属性 @Value("#{beanId.getSomenthing()}") //调用引用Bean的方法 ~~~ # 支持的运算符号 * 算数运算符: +, -, *, /, %, ^ ~~~ <property name="adjustedAmount" value="#{counter.total + 42}" /> <property name="adjustedAmount" value="#{counter.total - 20}" /> <property name="circumference" value="#{2 * T(java.lang.Math).PI * circle.radius}" /> <property name="average" value="#{counter.total / counter.count}" /> <property name="remainder" value="#{counter.total % counter.count}" /> <property name="area" value="#{T(java.lang.Math).PI * circle.radius ^ 2}" /> ~~~ * 加号还可以用作字符串连接 ~~~ <constructor-arg value="#{performer.firstName + ' ' + performer.lastName}" /> ~~~ * 比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge ~~~ <property name="equal" value="#{counter.total == 100}" /> <property name="hasCapacity" value="#{counter.total le 1000}" /> ~~~ * 逻辑运算符号: and, or, not, ! ~~~ <property name="large" value="#{shape.kind == shape.perimeter}" /> <property name="outOfStock" value="#{!product.available}" /> <property name="outOfStock" value="#{not product.available}" /> ~~~ * if-else运算符: ?:(elvis) ~~~ <constructor-arg value="#{songSelect? 'jelly': 'jack'}" /> ~~~ * if-else的变体 ~~~ <constructor-arg value="#{songSelect?: 'jack'}" /> ~~~ * 正则表达式:matches ~~~ <constructor-arg value="#{admin.email matches '[a-zA]'}" /> ~~~ * 调用静态方法和静态属性 通过T()调用一个类的静态方法,它将返回一个Class Object,然后再调用相应的方法或属性 ~~~ <property name="initValue" value="#{T(java.lang.Math).PT}"></property> ~~~ ~~~ @Value("#{T(java.lang.Math).PI}") @Value("#{T(java.lang.Math).random()}") @Value("#{T(java.lang.Math).random() * 100.0 }") ~~~