SpringFramework核心技术四:Spring表达式语言知识点(SpEL)

Spring Expression Language (SpEL) 是Spring框架中的强大表达式语言,用于在运行时查询和操作对象图。SpEL支持文字表达、布尔和关系运算、方法调用、属性访问等功能,广泛应用于Spring产品中。本文介绍了SpEL的基本概念、Evaluation、EvaluationContext、解析器配置和编译,以及在bean定义中的使用,包括XML配置和基于注解的方式。通过示例展示了SpEL如何进行属性和方法的访问、类型转换以及在bean定义中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring表达式

Sprng表达式,可以适用于几乎所有的Spring产品中,是一种非常重要的表达式语言,下面我们一起来看看。

一、介绍

Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。

虽然还有其他几种Java表达式语言可用 - OGNL,MVEL和JBoss EL,仅举几例 - 创建Spring表达式语言是为了向Spring社区提供单一支持良好的表达式语言,可用于所有产品中组合。它的语言特性受到Spring产品组合中项目需求的驱动,包括基于Eclipse的Spring Tool Suite中代码完成支持的工具需求。也就是说,SpEL基于技术不可知的API,允许在需要时集成其他表达式语言实现。

虽然SpEL是Spring产品组合中表达式评估的基础,但它并不直接与Spring结合,可以独立使用。为了自成一体,本章中的许多示例都使用SpEL,就好像它是独立的表达式语言一样。这需要创建一些引导基础结构类,比如解析器。大多数Spring用户不需要处理这个基础设施,只需要创建表达式字符串进行评估。这种典型用法的一个例子是将SpEL集成到创建XML或基于注释的bean定义中,如定义bean定义的表达式支持部分所示。

本章介绍表达式语言,其API以及其语言语法的特性。在几个地方,一个Inventor和Inventor的Society类被用作表达式评估的目标对象。这些类声明和用于填充它们的数据在本章最后列出。

表达式语言支持以下功能:

  • 文字表达
  • 布尔和关系运算符
  • 常用表达
  • 类表达式
  • 访问属性,数组,列表,地图
  • 方法调用
  • 关系运算符
  • 分配
  • 调用构造函数
  • Bean引用
  • 阵列构建
  • 内联列表
  • 内联地图
  • 三元运营商
  • 变量
  • 用户定义的功能
  • 集合投影
  • 集合选择
  • 模板化表达式

二、Evaluation

以下代码引入了SpEL API来评估文字字符串表达式“Hello World”。

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'");
String message = (String) exp.getValue();

消息变量的值只是’Hello World’。

您最有可能使用的SpEL类和接口位于程序包 org.springframework.expression及其子程序包(例如)中spel.support。

该接口ExpressionParser负责解析表达式字符串。在这个例子中,表达式字符串是由周围的单引号表示的字符串文字。该接口Expression负责评估以前定义的表达式字符串。有两个例外,可以被抛出,ParseException和EvaluationException在调用parser.parseExpression和exp.getValue 分别被抛出。

SpEL支持广泛的功能,例如调用方法,访问属性和调用构造函数。
作为方法调用的一个例子,我们concat在字符串文字上调用方法。

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();

现在输出的是:’Hello World!’。

作为调用JavaBean属性的示例,可以调用String属性Bytes,如下所示。

ExpressionParser parser = new SpelExpressionParser();

// invokes 'getBytes()'
Expression exp = parser.parseExpression("'Hello World'.bytes");
byte[] bytes = (byte[]) exp.getValue();

SpEL还支持使用标准点符号的嵌套属性,即 prop1.prop2.prop3属性值的设置
公共字段也可以被访问。

ExpressionParser parser = new SpelExpressionParser();

// invokes 'getBytes().length'
Expression exp = parser.parseExpression("'Hello World'.bytes.length");
int length = (Integer) exp.getValue();

可以调用String的构造函数,而不是使用字符串文字。

ExpressionParse
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值