Spring表达式语言(SPEL)学习(01)
算术运算
@Test
public void test01() {
// 定义解析器
ExpressionParser parser = new SpelExpressionParser();
// 使用解析器解析表达式
// 获取解析结果
Assert.assertTrue(parser.parseExpression("(1+2)*5 + 8-6/2").getValue().equals(20));//加减乘除
Assert.assertTrue(parser.parseExpression("8%3").getValue().equals(2));//求余
Assert.assertTrue(parser.parseExpression("2.0e3").getValue().equals(2000.0));//指数
Assert.assertTrue(parser.parseExpression("2^3").getValue().equals(8));//指数
}
逻辑运算
@Test
public void test02() {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("true and true").getValue(Boolean.class));//与
Assert.assertTrue(parser.parseExpression("true or false").getValue(Boolean.class));//与
Assert.assertTrue(parser.parseExpression("!false").getValue(Boolean.class));//非
}
比较运算
@Test
public void test03() {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("5>3").getValue(Boolean.class));
Assert.assertTrue(parser.parseExpression("5<=8").getValue(Boolean.class));
Assert.assertTrue(parser.parseExpression("5==5").getValue(Boolean.class));
Assert.assertTrue(parser.parseExpression("5!=6").getValue(Boolean.class));
}
使用字符代替符号
@Test
public void test19() {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("1 lt 2").getValue(boolean.class));//1<2
Assert.assertTrue(parser.parseExpression("1 le 2").getValue(boolean.class));//1<=2
Assert.assertTrue(parser.parseExpression("2 gt 1").getValue(boolean.class));//2>1
Assert.assertTrue(parser.parseExpression("2 ge 1").getValue(boolean.class));//2>=1
Assert.assertTrue(parser.parseExpression("1 ne 2").getValue(boolean.class));//1!=2
Assert.assertTrue(parser.parseExpression("not false").getValue(boolean.class));//!false
}
正则表达式
@Test
public void test20 () {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("123 matches '\\d{3}'").getValue(Boolean.class));//正则匹配三位数字
}
instanceof类型判断
@Test
public void test21 () {
ExpressionParser parser = new SpelExpressionParser();
//检测字符串是否是String的实例。
Assert.assertTrue(parser.parseExpression("'123' instanceof T(String)").getValue(Boolean.class));
}
三目运算
@Test
public void test22 () {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("1>2 ? 1 : 2").getValue(int.class) == 2);//1跟2之间的较大者为2。
Assert.assertTrue(parser.parseExpression("1<2 ? 2 : 1").getValue(int.class) == 2);//1跟2之间的较大者为2。
}
字符串
操作字符串时需要通过单引号'来进行包裹,而当我们的字符串中包含单引号时,那么对应的单引号需要使用一个单引号进行转义,即连续两个单引号
@Test
public void test04() {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("'abc'").getValue().equals("abc"));
Assert.assertTrue(parser.parseExpression("'''abc'").getValue().equals("'abc"));
}
方法调用
字符串与对象
/**
* 方法调用
*/
@Test
public void test6(){
ExpressionParser parser = new SpelExpressionParser();
//直接访问String的length()方法。
Assert.assertTrue(parser.parseExpression("'abc'.length()").getValue().equals(3));
String bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String.class);
System.out.println(bc);// bc
// 传递参数,调用Society的isMember方法
Society societyContext = new Society();
boolean isMember = parser.parseExpression("isMember('Mihajlo Pupin')").getValue(societyContext, Boolean.class);
System.out.println(isMember);// false
}
public Boolean isNumber(Object object) {
return object instanceof Integer;
}
构造方法new
使用 new 运算符调用构造函数。对除原始类型(int、float 等)和 String 之外的所有类型使用完全限定的类名
/**
* new 调用构造方法
*/
@Test
public void test12(){
Inventor value = parser.parseExpression("new com.crab.spring.ioc.demo20.Inventor('ooo','xxx')").getValue(Inventor.class);
System.out.println(value.getName() + " " + value.getNationality()); // ooo xxx
String value1 = parser.parseExpression("new String('xxxxoo')").getValue(String.class);
System.out.println(value1); // xxxxoo
Expression exp = parser.parseExpression("new String('hello world').toUpperCase()");
String message = exp.getValue(String.class);
}
类类型T
类中的静态变量、静态方法属于Class, 可以通过T(xxx).xxx调用
@Test
public void test11(){
// 1 获取类的Class java.lang包下的类可以不指定全路径
Class value = parser.parseExpression("T(String)").getValue(Class.class);
System.out.println(value);
// 2 获取类的Class 非java.lang包下的类必须指定全路径
Class dateValue = parser.parseExpression("T(java.util.Date)").getValue(Class.class);
System.out.println(dateValue);
// 3 类中的静态变量 静态方法属于Class 通过T(xxx)调用
boolean trueValue = parser.parseExpression(
"T(java.math.RoundingMode).CEILING < T(java.math.RoundingMode).FLOOR")
.getValue(Boolean.class); // true
System.out.println(trueValue);
Long longValue = parser.parseExpression("T(Long).parseLong('9999')").getValue(Long.class);
System.out.println(longValue);// 9999
}
表达式模板
表达式模板允许将文字文本与一个或多个评估块混合。每个评估块都由前缀和后缀字符分隔,默认是#{}。支持实现接口ParserContext自定义前后缀。调用parseExpression()时指定 ParserContext参数如:new TemplateParserContext(),#{}包起来的表达式会被计算
@Test
public void test23 () {
//the year is 2014
String expressionStr = "the year is #{T(java.util.Calendar).getInstance().get(T(java.util.Calendar).YEAR)}";
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(expressionStr, new TemplateParserContext());
System.out.println(expression.getValue());
}
elvis设置默认值
SPEL表达式中支持a?:b这样的语法来设置默认值,表达如果a不为null时其结果为a,否则就为b
@Test
public void test () {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("#abc?:123").getValue().equals(123));//变量abc不存在
Assert.assertTrue(parser.parseExpression("1?:123").getValue().equals(1));//数字1不为null
}
?.嵌套属性安全访问
多级属性访问,如国家城市城镇nation.city.town三级访问,如果中间的 city是null则会抛出 NullPointerException 异常。为了避免这种情况的异常,SpEL借鉴了Groovy的语法?.,如果中间属性为null不会抛出异常而是返回null
/**
* 多级属性安全访问
*/
@Test
public void test18(){
Inventor inventor = new Inventor("xx", "oo");
inventor.setPlaceOfBirth(new PlaceOfBirth("北京", "中国"));
// 正常访问
String city = parser.parseExpression("PlaceOfBirth?.city").getValue(context, inventor, String.class);
System.out.println(city); // 北京
// placeOfBirth为null
inventor.setPlaceOfBirth(null);
String city1 = parser.parseExpression("PlaceOfBirth?.city").getValue(context, inventor, String.class);
System.out.println(city1); // null
// 非安全访问 异常
String city3 = parser.parseExpression("PlaceOfBirth.city").getValue(context, inventor, String.class);
System.out.println(city3); // 抛出异常
}
Spring表达式语言(SPEL)学习(01)的更多相关文章
- Spring学习笔记--Spring表达式语言SpEL
Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...
- Spring表达式语言SpEL
Spring表达式语言,简称SpEL,是一个支持运行时查询和操作对象图的强大的表达式语言.语法类似于EL:SpEL使用#{…}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean属 ...
- Spring表达式语言SpEL简单介绍
Spring3引入了Spring表达式语言(Spring Expression Language,SpEL). SpEL有非常多特性.比較经常使用的包含: 1.使用bean的id来引用bean, 以下 ...
- Spring3表达式语言(SpEL)学习笔记
最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...
- Spring表达式语言:SpEl
概念: 是一个支持运行时查询和操作的对象图的强大的表达式语言. 语法类似于EL:SpEl使用#{ ...}作为定界符,所有在大括号中的 字符都将被认为是SpEl SpEl为bean的属性进行动态赋值提 ...
- Spring ——表达式语言 Spring Expression Language (转载)
目录 SpEL简介与功能特性 一.为什么需要Spring表达式语言 二.SpEL表达式Hello World! 三.SpEL表达式 3.1.文字表达式 3.2.SPEL语言特性 3.2.1.属性 3. ...
- Sping表达式语言--SpEL
Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean ...
- Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)
5.1 概述 5.1.1 概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ...
- 开涛spring3(5.1&5.2) - Spring表达式语言 之 5.1 概述 5.2 SpEL基础
5.1 概述 5.1.1 概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行 ...
- 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)
7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...
随机推荐
- 临时表、视图与系统函数_Lab2
MySQL数据库操作 Lab1.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSys ...
- Python - 字典3
修改字典项 您可以通过引用其键名来更改特定项的值: 示例,将 "year" 更改为 2018: thisdict = { "brand": "Ford ...
- Windows下VC++编译器32位memcpy、memmove函数汇编代码详解
整理者:赤勇玄心行天道 QQ号:280604597 微信号:qq280604597 QQ群:511046632 博客:www.cnblogs.com/gaoyaguo blog.csdn.net/c ...
- 【Unity3D】UI Toolkit数据动态绑定
1 前言 本文将实现 cvs 表格数据与 UI Toolkit 元素的动态绑定. 如果读者对 UI Toolkit 不是太了解,可以参考以下内容. UI Toolkit简介 UI Toolki ...
- HarmonyOS原生分析能力,即开即用助力精细化运营
数据分析产品对开发者的价值呈现在两个层面,第一个是产品的层面,可以通过数据去洞察用户的行为,从而找到产品的优化点.另外一个就是运营层面,可以基于数据去驱动,来实现私域和公域的精细化运营. 在鸿蒙生态上 ...
- redis主从同步及redis哨兵机制
1.主从和哨兵的作用: 角色 作用 主从 1.(提供)数据副本:多一份数据副本,保证redis高可用 2. 扩展(读)性能:如容量.QPS等 哨兵 1.监控: 监控redis主库及从库运行状态: 2 ...
- powershell 7 初体验
支持枚举定义,类定义\类继承\接口继承,不支持接口定义\泛型类定义\泛型函数定义,但是作为shell脚本已经相当让人惊喜了, 基本逻辑可以直接套用C#语法格式 # enum_sample/main.p ...
- c#中建造者设计模式详解
基础介绍: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 说白了就是将一个复杂的对象拆分成一个一个零件,然后按照既定顺序和规则进行组装,最终形成这个相对复杂的对象 ...
- .NET8 WebApplication剖析
WebApplication 是用于配置HTTP管道和路由的web应用程序,接来下我将一一拆解它的组成. /// <summary> /// The web application u ...
- 一篇文章让你理解:什么是Spring???
背景 市场上,随便一个Java工程师的招牌要求上,都可以看到SSM.Spring.SpringMVC...类似字样.这玩意到底是个啥? 这是中邮消费招聘的岗位要求,可以看到第3点: 3.熟悉Strut ...