Spring系列第39篇:强大的Spel表达式

算数运算表达式

SpEL支持加(+)、减(-)、乘(*)、除(/)、求余(%)、幂(^)运算。

| 类型 | 示例 |

| — | — |

| 加减乘除 | int result1 = parser.parseExpression(“1+2-3*4/2”).getValue(Integer.class);//-3 |

| 求余 | int result2 = parser.parseExpression(“4%3”).getValue(Integer.class);//1 |

| 幂运算 | int result3 = parser.parseExpression(“2^3”).getValue(Integer.class);//8 |

SpEL还提供求余(MOD)和除(DIV)而外两个运算符,与“%”和“/”等价,不区分大小写。

关系表达式

等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=),区间(between)运算。

parser.parseExpression("1>2").getValue(boolean.class);将返回false;

parser.parseExpression("1 between {1, 2}").getValue(boolean.class);将返回true。

between运算符右边操作数必须是列表类型,且只能包含2个元素。第一个元素为开始,第二个元素为结束,区间运算是包含边界值的,即 xxx>=list.get(0) && xxx<=list.get(1)

SpEL同样提供了等价的“EQ” 、“NE”、 “GT”、“GE”、 “LT” 、“LE”来表示等于、不等于、大于、大于等于、小于、小于等于,不区分大小写。

@Test

public void test3() {

ExpressionParser parser = new SpelExpressionParser();

boolean v1 = parser.parseExpression(“1>2”).getValue(boolean.class);

boolean between1 = parser.parseExpression(“1 between {1,2}”).getValue(boolean.class);

System.out.println(“v1=” + v1);

System.out.println(“between1=” + between1);

}

输出

v1=false

between1=true

逻辑表达式

且(and或者&&)、或(or或者||)、非(!或NOT)。

@Test

public void test4() {

ExpressionParser parser = new SpelExpressionParser();

boolean result1 = parser.parseExpression(“2>1 and (!true or !false)”).getValue(boolean.class);

boolean result2 = parser.parseExpression(“2>1 && (!true || !false)”).getValue(boolean.class);

boolean result3 = parser.parseExpression(“2>1 and (NOT true or NOT false)”).getValue(boolean.class);

boolean result4 = parser.parseExpression(“2>1 && (NOT true || NOT false)”).getValue(boolean.class);

System.out.println(“result1=” + result1);

System.out.println(“result2=” + result2);

System.out.println(“result3=” + result3);

System.out.println(“result4=” + result4);

}

输出

result1=true

result2=true

result3=true

result4=false

字符串连接及截取表达式

使用“+”进行字符串连接,使用“‘String’[0] [index]”来截取一个字符,目前只支持截取一个,如“'Hello ’ + ‘World!’”得到“Hello World!”;而“‘Hello World!’[0]”将返回“H”。

三目运算

三目运算符 **“表达式1?表达式2:表达式3”**用于构造三目运算表达式,如“2>1?true:false”将返回true;

Elivis运算符

Elivis运算符**“表达式1?:表达式2”**从Groovy语言引入用于简化三目运算符的,当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2,简化了三目运算符方式“表达式1? 表达式1:表达式2”,如“null?:false”将返回false,而“true?:false”将返回true;

正则表达式

使用“str matches regex,如“‘123’ matches ‘\d{3}’”将返回true;

括号优先级表达式

使用“(表达式)”构造,括号里的具有高优先级。

类相关表达式

类类型表达式

使用“T(Type)”来表示java.lang.Class实例,“Type”必须是类全限定名,“java.lang”包除外,即该包下的类可以不指定包名;使用类类型表达式还可以进行访问类静态方法及类静态字段。

具体使用方法如下:

@Test

public void testClassTypeExpression() {

ExpressionParser parser = new SpelExpressionParser();

//java.lang包类访问

Class result1 = parser.parseExpression(“T(String)”).getValue(Class.class);

System.out.println(result1);

//其他包类访问

String expression2 = “T(com.javacode2018.spel.SpelTest)”;

Class value = parser.parseExpression(expression2).getValue(Class.class);

System.out.println(value == SpelTest.class);

//类静态字段访问

int result3 = parser.parseExpression(“T(Integer).MAX_VALUE”).getValue(int.class);

System.out.println(result3 == Integer.MAX_VALUE);

//类静态方法调用

int result4 = parser.parseExpression(“T(Integer).parseInt(‘1’)”).getValue(int.class);

System.out.println(result4);

}

输出

class java.lang.String

true

true

1

对于java.lang包里的可以直接使用“T(String)”访问;其他包必须是类全限定名;可以进行静态字段访问如“T(Integer).MAX_VALUE”;也可以进行静态方法访问如“T(Integer).parseInt(‘1’)”。

类实例化

类实例化同样使用java关键字“new”,类名必须是全限定名,但java.lang包内的类型除外,如String、Integer。

@Test

public void testConstructorExpression() {

ExpressionParser parser = new SpelExpressionParser();

String result1 = parser.parseExpression(“new String(‘路人甲java’)”).getValue(String.class);

System.out.println(result1);

Date result2 = parser.parseExpression(“new java.util.Date()”).getValue(Date.class);

Sy

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值