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

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  

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

相关推荐

    Spring Cloud Gateway Actuator API SpEL表达式注入命令执行 0day 漏洞复现

    本文将详细探讨一个重要的安全问题——Spring Cloud Gateway Actuator API 的SpEL(Spring Expression Language)表达式注入漏洞(CVE-2022-22947),该漏洞可能导致命令执行,对系统安全构成严重威胁。首先,我们...

    Spring Boot配置Thymeleaf(gradle)的简单使用

    Spring Boot 配置 Thymeleaf 的简单使用 在本文中,我们将讨论如何在 Spring Boot 项目中配置 Thymeleaf,以便于使用 HTML 视图模板。Thymeleaf 是一个流行的模板引擎,可以帮助我们快速开发 Web 应用程序。在以下...

    spring3.0_doc_api

    4. **基于表达式的SpEL(Spring Expression Language)**:提供了强大的表达式语言,用于在运行时查询和操作对象图。 5. **RESTful Web服务支持**:Spring MVC模块增加了对RESTful服务的支持,通过`@RequestMapping...

    Spring3.0_MVC_中文教程

    同时,Spring3.0引入了一种新的表达式语言——Spring 表达式语言(SpEL),它允许在XML和注解中定义基于bean的定义。此外,Spring3.0还支持REST Web服务和注解的格式化,例如,可以使用@DateTimeFormat和@...

    spring security 2.0 的简单配置使用(补)——用aop控制method级权限

    `@PreAuthorize`允许使用SpEL(Spring Expression Language)表达式进行更复杂的权限检查。 5. **自定义访问决策策略** 默认的访问决策管理器可能不满足所有需求,我们可以创建自定义的访问决策策略。例如,可以...

    最新版spring-framework-4.3.10.RELEASE-dist完整包

    12. **Spring Expression Language (SpEL)**:SpEL是Spring的表达式语言,用于在运行时查询和操作对象图。 13. **事件驱动架构**:Spring支持事件驱动编程模型,允许组件之间通过发布和监听事件进行通信。 14. **...

    spring学习笔记(四)

    这里的`#{systemProperties['java.version']}`就是一个SpEL表达式,它会获取系统属性`java.version`的值。 除了`@Value`,Spring还提供了其他许多工具和注解,如`@Autowired`用于自动装配Bean,`@Component`、`@...

    spring-2.5.6.jar

    8. **Spring表达式语言(SpEL)**:Spring Expression Language是Spring框架内的一种强大表达式语言,用于在运行时查询和操纵对象图。它可以用于Bean装配、AOP等方面,提供灵活的数据绑定和表达式计算。 9. **...

    跟开涛学Spring

    1.15 【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3 . . . . . . . . . . . . . . .177 1.16 【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3 . . . . . . . . . . . . ....

    spring-framework-reference 3.0

    Spring 3.0 中引入了一个新的表达式语言——**Spring Expression Language (SpEL)**。这是一种强大的脚本语言,用于在Spring组件之间描述任务和配置。SpEL可以更好地与XML配置文件交互,并且对于安全性和集成方面...

    spring 1到3大版本号下的最高版本

    2.5.6引入了Spring Expression Language (SpEL),这是一个强大的表达式语言,用于在运行时查询和操作对象图。此外,它还引入了基于注解的配置,使得开发者可以使用注解替代XML配置文件,大大简化了项目设置。这个...

    跟我学spring

    【第五章】Spring表达式语言(SpEL)是一个强大的表达式语言,支持在运行时查询和操作对象图。5.1节概述SpEL,5.2节和5.3节详细说明SpEL的基础和语法,5.4节则展示了如何在Bean定义中使用SpEL。 【第六章】面向切面...

    spring-3.1.0中文版api帮助文档.pdf

    Spring 3.1新增了Spring表达式语言(SpEL),这是一种强大的领域特定语言,用于在运行时查询和操纵对象图。SpEL支持丰富的操作符和函数,可以用于属性访问、算术运算、条件判断等多种场景。SpEL不仅可以作为字符串在...

    spring2.0中文开发参考手册.chm.zip

    7. **Spring表达式语言(SpEL)**:Spring Expression Language是Spring 2.0引入的一种强大表达式语言,用于在运行时查询和操作对象图。SpEL可以用在配置中,用于动态计算属性值。 8. **单元测试与集成测试**:...

    spring框架:spring-framework-4.3.9.RELEASE-dist

    5. **Spring Expression Language (SpEL)**:一种强大的表达式语言,用于在运行时查询和操作对象图。 四、实践应用 在实际项目中,开发者可以利用Spring框架4.3.9.RELEASE来构建模块化的应用,通过DI管理组件之间的...

    spring4.1.5、4.3.15、4.3.24版本使用的jar包

    同时,Spring 4.1还引入了Spring Expression Language (SpEL)的增强,允许更灵活的表达式计算。 2. **Spring 4.3.x系列**:这个版本系列是对4.1的重大升级,4.3.15和4.3.24是其中的稳定版本。Spring 4.3引入了更多...

    spring4.2的lib包

    5. **更强大的SpEL(Spring Expression Language)**:Spring的表达式语言在4.2版本中也有所增强,提供了更多函数和操作符,使得在运行时动态评估表达式更为强大。 综上所述,`spring4.2.jar`是Spring框架4.2版本的...

    spring aop依赖jar包

    - `spring-expression.jar`(可能需要):Spring表达式语言(SpEL),用于在运行时查询和操作对象图。 在使用这些jar包时,你需要确保它们都在你的项目类路径(ClassPath)下。如果你使用Maven或Gradle等构建工具,...

    spring3.1.o.m2 dist

    5. **Spring Expression Language (SpEL)**:Spring的表达式语言,用于在运行时查询和操作对象图。它可以用于配置元数据,如在AOP切点表达式中。 6. **AOP代理**:Spring支持JDK动态代理和CGLIB代理,用于创建AOP切...

Global site tag (gtag.js) - Google Analytics