`
234390216
  • 浏览: 10242824 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:463049
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1776354
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1399134
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395223
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680284
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531327
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1185760
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:469407
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151585
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68459
社区版块
存档分类
最新评论

Spring(23)——SPEL表达式(一)

阅读更多

23 SpEl

23.1 简介

Spring也有自己的EL,叫Spring Expression Language,简称SpEl。其可以在程序中单独使用,也可以在Spring应用中进行bean定义时使用。其核心是org.springframework.expression.Expression接口,Spring使用该接口来表示EL中的表达式。通过Expression接口的系列getValue()方法我们可以获取对应Expression在特定EvaluationContext下的值,也可以通过其系列setValue()方法来设值。对应的Expression通常不是由我们直接来new对应实现类的实例,而是通过Spring提供的org.springframework.expression.ExpressionParser接口的系列parseExpression()方法来将一个字符串类型的表达式解析为一个Expression。以下是一个简单的示例,在该示例中我们将字符串表达式“1+2”解析为一个Expression,然后进行计算得出其值为3。

@Test
public void test() {
	String expressionStr = "1+2";
	ExpressionParser parser = new SpelExpressionParser();
	Expression expression = parser.parseExpression(expressionStr);
	Integer val = expression.getValue(Integer.class);
	System.out.println(expressionStr + "的结果是:" + val);
}

Expression接口有一系列的getValue()方法,当其不接收任何参数时表示将会把Expression的计算结果当做一个Object进行返回,如果我们希望返回的是特定的类型,则可以传递对应的类型作为getValue()方法的参数,如上述示例中传递的Interger.class。我们也可以通过给Expression的getValue()方法传递EvaluationContext用以获取在特定环境下的计算结果,也可以传递一个Object作为Expression计算的rootObject。关于Expression接口的更多介绍请参考Spring的API文档。

23.2 示例

SpEl可以支持一般的算术运算,也可以支持逻辑运算,还可以支持对象的方法调用等。下面我们来看一些对应用法的示例。

23.2.1 算术运算

SpEl支持的算术运算可以是加、减、乘、除、求余、指数等。下面是一个对应的示例。

@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));//指数
}

23.2.2 逻辑运算

逻辑运算就是我们熟悉的与、或、非,在SpEl中就对应“and”、“or”和“!”。

@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));//
}

23.2.3 比较运算

比较运算就是我们熟悉的大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(==)和不等于(!=)。

@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));
}

23.2.4 字符串

SpEl允许我们在表达式中直接使用int、double、String等。我们的Expression可以通过对应的字符串进行解析,那么当我们的表达式就是需要表示一个字符串时应该如何表示呢?这个时候需要通过单引号“’”来进行包裹。而当我们的字符串中包含单引号时,那么对应的单引号需要使用一个单引号进行转义,即连续两个单引号。

@Test
public void test04() {
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertTrue(parser.parseExpression("'abc'").getValue().equals("abc"));
	Assert.assertTrue(parser.parseExpression("'''abc'").getValue().equals("'abc"));
}

23.2.5 访问方法

在SpEl表达式中我们也可以直接访问对象的方法。在下述示例中我们就直接在SpEl中访问了字符串的length()方法。

@Test
public void test05() {
	ExpressionParser parser = new SpelExpressionParser();
	//直接访问String的length()方法。
	Assert.assertTrue(parser.parseExpression("'abc'.length()").getValue().equals(3));
}

23.2.6 使用EvaluationContext

我们先来看一个例子,在下列示例中我们在表达式中直接写name和getName(),这个时候Expression是无法解析的,因为其不知道name和getName()对应什么意思。

@Test
public void test06() {
	ExpressionParser parser = new SpelExpressionParser();
	parser.parseExpression("name").getValue();
	parser.parseExpression("getName()").getValue();
}

通过指定EvaluationContext我们就可以让name和getName()变得有意义。指定了EvaluationContext之后,Expression将根据对应的EvaluationContext来进行解析。如下示例中我们构建了一个基于user对象的EvaluationContext,user对象将作为StandardEvaluationContext的rootObject,那么对应的Expression就将根据该rootObject对象来获取对应表达式的值。我们可以看到user对象定义了一个getName()方法,在解析name和getName()表达式时都将访问user对象的getName()方法,即它们的返回结果都为字符串“abc”。

@Test
public void test06() {
	Object user = new Object() {
		public String getName() {
			return "abc";
		}
	};
	EvaluationContext context = new StandardEvaluationContext(user);
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertTrue(parser.parseExpression("name").getValue(context, String.class).equals("abc"));
	Assert.assertTrue(parser.parseExpression("getName()").getValue(context, String.class).equals("abc"));
}

上述示例中的表达式name表示对应EvaluationContext的rootObject的一个属性,在进行解析时,如果对应的get方法存在,则将直接访问对应的get方法,如上述示例中的getName(),否则将直接对其进行访问,这个时候就需要我们的属性是公有的,以便外部类可以访问。
对于对象而言,我们可以访问其属性的属性或方法,中间以点进行连接。

23.2.7 使用rootObject

当我们的表达式是基于某一个对象的时,我们也可以把对应的对象作为一个rootObject传递给对应的Expression以进行取值。如上述示例我们也可以直接将user对象作为rootObject传递给对应的Expression以获取对应的值。

@Test
public void test07() {
	Object user = new Object() {
		public String getName() {
			return "abc";
		}
	};
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertTrue(parser.parseExpression("name").getValue(user, String.class).equals("abc"));
	Assert.assertTrue(parser.parseExpression("getName()").getValue(user, String.class).equals("abc"));
}

23.2.8 List、Array、Map等元素的访问

在SpEl中我们可以通过索引的形式访问List或Array的某一个元素,对应的索引是从0开始的,以“list[index]”的形式出现。如下述示例中的test08_1和test08_2。

@Test
public void test08_1() {
	Object user = new Object() {
		public List<String> getInterests() {
			List<String> interests = Arrays.asList(new String[] {"BasketBall", "FootBall"});
			return interests;
		}
	};
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertTrue(parser.parseExpression("interests[0]").getValue(user, String.class).equals("BasketBall"));
	Assert.assertTrue(parser.parseExpression("interests[1]").getValue(user, String.class).equals("FootBall"));
}
	
@Test
public void test08_2() {
	Object user = new Object() {
		public String[] getInterests() {
			return new String[] {"BasketBall", "FootBall"};
		}
	};
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertTrue(parser.parseExpression("interests[0]").getValue(user, String.class).equals("BasketBall"));
	Assert.assertTrue(parser.parseExpression("interests[1]").getValue(user, String.class).equals("FootBall"));
}

而对于Map而言,则是通过类似于“map[key]”的形式访问对应的元素的。示例如下。

@Test
public void test08_3() {
	Object user = new Object() {
		public Map<String, String> getInterests() {
			Map<String, String> interests = new HashMap<String, String>();
			interests.put("key1", "BasketBall");
			interests.put("key2", "FootBall");
			return interests;
		}
	};
	ExpressionParser parser = new SpelExpressionParser();
	Assert.assertTrue(parser.parseExpression("interests['key1']").getValue(user, String.class).equals("BasketBall"));
	Assert.assertTrue(parser.parseExpression("interests['key2']").getValue(user, String.class).equals("FootBall"));
}

 

 

2
1
分享到:
评论
2 楼 234390216 2017-09-14  
Caelebs 写道

好久以前学过的, 居然全忘了

不怎么用的东西是忘的快。好多我写过,以前用过的东西,现在不用都基本忘光了。
1 楼 Caelebs 2017-09-14  

好久以前学过的, 居然全忘了

相关推荐

    Matlab下低通切比雪夫I型IIR高通滤波器验证:低频余弦噪声滤波效果仿真图,Matlab 原型低通切比雪夫I型IIR高通滤波器及滤波验证成品 (1型)验证添加的噪声为低频余弦噪声 仿真出图如下

    Matlab下低通切比雪夫I型IIR高通滤波器验证:低频余弦噪声滤波效果仿真图,Matlab 原型低通切比雪夫I型IIR高通滤波器及滤波验证成品。 (1型)验证添加的噪声为低频余弦噪声。 仿真出图如下。 ,Matlab;原型;低通切比雪夫I型;IIR高通滤波器;噪声验证;低频余弦噪声。,Matlab中I型IIR滤波器设计与低频噪声去除验证

    级联IIR和FIR滤波器的微波光子滤波器的特性分析.pdf

    级联IIR和FIR滤波器的微波光子滤波器的特性分析.pdf

    智能网联环境下城市交通主干线协调控制研究.pdf

    智能网联环境下城市交通主干线协调控制研究.pdf

    《已调试》springboot+vue+redis前后端分离网上商城项目003(源码+sql).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    Java毕业设计-springboot-vue-医护人员排班系统(源码+sql脚本+29页零基础部署图文详解+27页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    springboot-汽车配件销售管理系统-kp8i9cgz.zip

    springboot-汽车配件销售管理系统_kp8i9cgz.zip

    Java毕业设计-springboot-vue-大学生租房平台(源码+sql脚本+29页零基础部署图文详解+37页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    Java毕业设计-springboot-vue-二手车交易系统(源码+sql脚本+29页零基础部署图文详解+37页论文+18页答辩+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    水下机器人AUV的路径规划及基于模型预测控制MPC的跟踪框架实现与解析,4-IEEE trans顶刊复现,水下机器人AUV的路径规划和基于模型预测控制MPC的跟踪框架 参考文献和建模过程请参考图片中

    水下机器人AUV的路径规划及基于模型预测控制MPC的跟踪框架实现与解析,4-IEEE trans顶刊复现,水下机器人AUV的路径规划和基于模型预测控制MPC的跟踪框架。 参考文献和建模过程请参考图片中的文章,本代码包括路径规划和MPC路径跟踪两个模块,两个模块均采用优化求解器求解,考虑了AUV的水动力学模型,结果是2D空间内的平面路径。 输出的结果请见下图 ,关键词:IEEE trans顶刊复现; 水下机器人AUV; 路径规划; 模型预测控制MPC; 跟踪框架; 优化求解器; 水动力学模型; 2D空间平面路径。,基于IEEE Trans顶刊复现的AUV路径规划与MPC跟踪框架研究

    最新总裁导航系统源码 全新重构版强势回归

    总裁导航系统是一款为个人站长打造的专业导航+文章管理系统,以卓越的系统性能,个性的后台操作,丰富的系统功能,解决大多数小白/个人站长想做网站却又不太会的难题

    Java毕业设计-springboot-vue-房屋租赁系统(源码+sql脚本+29页零基础部署图文详解+36页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    COMSOL冻土水热耦合模型PDE建模详解:包含降水入渗功能及视频教程-初学者入门指南,comsol冻土水热耦合模型,使用pde建模,模型可以考虑降水入渗,另外也有视频教程 comsol小白可前来

    COMSOL冻土水热耦合模型PDE建模详解:包含降水入渗功能及视频教程——初学者入门指南,comsol冻土水热耦合模型,使用pde建模,模型可以考虑降水入渗,另外也有视频教程。 comsol小白可前来拿后#学习 ,关键词:COMSOL冻土水热耦合模型;PDE建模;降水入渗;视频教程;COMSOL小白学习。,COMSOL冻土水热耦合模型:PDE建模与降水入渗分析教程

    三相PWM整流器闭环仿真:电压电流双闭环控制及Matlab Simulink模型实现,三相PWM整流器 三相PWM整流器闭环仿真,电压电流双闭环控制,输出直流电压做外环 模型中包含主电路,坐标变,电压

    三相PWM整流器闭环仿真:电压电流双闭环控制及Matlab Simulink模型实现,三相PWM整流器 三相PWM整流器闭环仿真,电压电流双闭环控制,输出直流电压做外环 模型中包含主电路,坐标变,电压电流双环PI控制器,PWM发生器 matlab simulink模型 ,三相PWM整流器; 闭环仿真; 电压电流双闭环控制; PI控制器; PWM发生器; MATLAB Simulink模型。,"三相PWM整流器:电压电流双闭环PI控制与Matlab Simulink模型仿真"

    Java毕业设计-springboot-vue-旅游管理系统(源码+sql脚本+29页零基础部署图文详解+33页论文+环境工具+教程+视频+模板).zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:29页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 Spring Boot 框架搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 使用Spring Boot搭建后台。VUE 框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    2025年材料员网络培训考试题库及答案.pptx

    2025年材料员网络培训考试题库及答案.pptx

    541心灵治愈交流平台.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    InfiniBand架构1.3虚拟化特性扩展及其配置方法

    内容概要:本文档作为InfiniBand架构发布版本1.3的补充附件(Volume 1),主要介绍了InfiniBand架构对虚拟化的支持以及相应的配置方法。文中定义了多个虚拟化的端点存在于物理主机通道适配器中,并引入了一系列新概念如虚拟HCA(VHCA)、虚拟端口(VPort)及其属性设置规则,以应对现代大规模虚拟化解决方案的需求并确保其兼容性和性能表现。此外,文档详细描述了各类型VPort的状态管理方式,不同数据包类型的传输路由机制,以及与子网管理和性能监测相关的一系列属性配置方法。 适合人群:对于InfiniBand架构有基本理解的数据中心工程师和技术研究员。 使用场景及目标:适用于希望增强现有基础设施能力的企业网络管理员;希望通过深入理解协议栈来优化应用程序部署的技术开发者;致力于提高多租户环境稳定性的云计算从业者。 其他说明:文档还探讨了如何在保持原有系统功能的前提下平滑迁移至新的虚拟化框架,为未来的发展奠定了良好的基础。同时提供了一些针对特殊情况下的建议措施,如当遇到错误陷阱时该如何处理等问题。

    2025年辐射安全与防护培训题库及答案.doc

    2025年辐射安全与防护培训题库及答案.doc

    Greenplum Clients for RHEL 8 gpdb client

    Greenplum Clients for RHEL 8 greenplum-db-clients-7.3.3-el8-x86_64.rpm(68.18 MB) Dec 18, 2024 Dec 18, 2024 cf4d9bea2b7a0a39b86f879b3ab5835547e845e730adf73fe89e3b047ad8e91d ca8d7ab4fe99b276361afb4bf85ae775

    永磁同步电机旋转高频信号注入法:零低速无位置控制的噪声低损耗仿真研究,永磁同步电机旋转高频信号注入法零低速无位置控制仿真,相比高频方波信号注入法,旋转高频信号注入法噪声更小损耗更低 ,核心关键词:

    永磁同步电机旋转高频信号注入法:零低速无位置控制的噪声低损耗仿真研究,永磁同步电机旋转高频信号注入法零低速无位置控制仿真,相比高频方波信号注入法,旋转高频信号注入法噪声更小损耗更低。 ,核心关键词:永磁同步电机;旋转高频信号注入法;零低速无位置控制仿真;高频方波信号注入法;噪声;损耗。,永磁同步电机:旋转高频信号注入法低噪声低损耗控制仿真

Global site tag (gtag.js) - Google Analytics