Spring表达式语言(SpEL)

Spring表达式语言:SpEL

  • Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言
  • 语法类似于EL:SpEL使用#{…}作为定界符,所有在大框号中的字符都被认为是SpEL
  • SpEL为bean的属性进行动态赋值提供了便利
  • 通过SpEL可以实现:
    • 通过bean的id对bean进行引用
    • 调用方法以及引用对象中的属性
    • 正则表达式的值
    • 正则表达式的配置

SpEL:字面值

  • 整数:<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}“/>

SpEL:引用Bean、属性和方法

  • 引用其他对象:

    1
    2
    <!-- 通过value属性和 SpEL 配置 Bean 之间的应用关系 -->
    <property name = "prefix" value = "#{prefixGenerator}"></property>
  • 引用其他对象的属性

    1
    2
    <!-- 通过value属性和 SpEL 配置 suffix 配置值为另一个bean的suffix属性值 -->
    <property name = "suffix" value = "#{sequenceGenerator2.suffix}"></property>
  • 调用其他方法,还可以链式操作

    1
    2
    3
    4
    <!-- 过value属性和 SpEL 配置 suffix 配置值为另一个bean的返回值 -->
    <property name = "suffix" value = "#{sequenceGenerator2.toString()}"></property>
    <!-- 方法的连缀 -->
    <property name = "suffix" value = "#{sequenceGenerator2.toString().toUpperCase()}"></property>

SpEL支持的运算符号

  • 算数运算符:+,-,*,%,^:

    1
    2
    3
    4
    5
    <property name = "adjustedAmount" value = "#{counter.total + 43}" />
    <property name = "adjustedAmount" value = "#{counter.total - 13}" />
    <property name = "circumference" value = "#{2* T(java.lang.Math).PI * circle.radius}" />
    <property name = "average" value = "#{counter.total / counter.total}" />
    <property name = "area" value = "#{T(java.lang.Math).PI * circle.radius * 2}" />
  • 加号还可以用作字符串连接:

    1
    <constructor-arg value = "performer.firstName + ' ' + performer.LastName" />
  • 比较运算符:&lt,&gt,==,<=,>=,lt,gt,eq,le,ge

    1
    2
    <property name="equal" value = "#{counter.total == 100}" />
    <property name="hasCapacity" value = "#{counter.total le 100000}" />
  • 逻辑运算符号:and,or,not,|

    1
    2
    3
    <property name="largeCircle" value = "#{shape.kind == 'circle' and shape.perimeter gt 10000}" />
    <property name="outOfStock" value = "#{product.available}" />
    <property name="outofStock" value = "#{not product.available}" />
  • if-else运算符:?:(temary),?:(Elvis)

    1
    <constructor-arg value = "#{songSelector.seLectSong()=='Jingle BeLLs'?piano:'Jingle Bells'}"/>
  • if-else的字体

    1
    <constructor-arg value = "#{kenny.song?:'Greensleeves'}"/>
  • 正则表达式:matches

    1
    <constructor-arg value = "#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'}"/>
  • 调用静态方法或静态方法:通过T()调用一个类的静态方法,它将返回一个ClassObject,然后再调用相应的方法或者属性:

    1
    <property name="initValue" value = "#{T(java.Lang.Math).PI}" />
-------------本文结束 感谢您的阅读-------------
文章对我有益,我要小额赞赏...