《精通Spring4.x 企业应用开发实战》第9章 Spring SpEL

前言

Spring 动态表达式语言(简称 SpEL)是一个支持运行时查询和操作对象图的强大动态语言。其语法类似于 EL 表达式,具有诸如显式方法调用和基本宇符串模板函数等特性。本章对JVM动态语言进行简要概述,并对 SpEL 动态语言特性及其表达式的用法进行详细介绍,通过实例逐步揭开 SpEL 表达式的层层外衣。通过本章的学习,读者不仅可以运用 SpEL 表达式解决实际项目中的一些通用性表达式需求,还可以应用 SpEL提供的扩展,点来解决一些高阶问题。

9.1 JVM动态语言

9.2 SpEL 表达式概述

Spring 动态语言(简称 SpEL)是一个支持运行时查询和操作对象图的强大的动态语言。其语法类似于 EL 表达式,具有诸如显式方法调用和基本字符串模板函数等特性。
同其他的 Java 动态语言相比(如国外的 OGNL、MVEL 和 JBoss EL,国内的 Aviator、IKExpression 和 FastEL 等),SpEL 不但提供上述表达式的类似功能,而且更加简洁、灵活。加之出自 Spring 社区之手,与 Spring 框架及其子项目的结合显得更加顺畅自然。
SpEL 作为 Spring 家族中表达式求值的基础,它不直接依赖干 Spring 框架,可独立使用,只是在基于 Spring 的框架中使用 SpEL 更加便捷,一般情况下,无须手工调用 SpEL提供的 API。因为 Spring 框架己经提供了许多直接使用 SpEL 表达式的方法,并且在框架层面屏蔽了表达式的运行设施创建过程,直接使用即可。例如,在 Bean 配置定义中,可以直接通过“#{}”编写 SpEL 表达式。
为了更好地学习 SpEL 动态语言,本章中的示例将 SpEL 作为一个独立的动态语言来使用,通过手工调用 SpEL API来讲解其各种表达式的用法。下面先通过一个简单的示例来认识一下 SpEL。在使用 SpEL 之前,需要在 pom.xml 文件中添加 spring-expression模块依赖,如代码清单9-2所示。
图片.png
SpEL 被设计成一个可独立运行的模块,可以脱离 Spring 容器直接运行,因此只需引入 SpEL 的模块 spring-expression 即可,无须引入 Spring 框架的其他模块。接下来,在代码中就可以使用 SpEL 提供表达式解析类,如代码清单9-3所示。
图片.png
在SpEL 中,使用表达式非常简单,只需创建一个 SpelExpressionParser 实例即可。也就是首先创建一个 SpEL 表达式解析器,然后调用 ExpressionParser#parseExpression(方法对表达式进行解析。其中,单引号表示 String 类型,如示例中的 Hello、World。

9.3 SpEL核心接口

图片.png

9.4 SpEL基础表达式

图片.png

9.5 在Spring 中使用 SpEL

XML配置方式注解配置方式中都可以使用 SpEL 表达式进行一些高级配置,两种方式都采用统一的语法使用 SpEL 表达式:#{ }

9.5.1 基于XML 的配置

在Bean 配置中,可以使用 SpEL 表达式为 Bean 属性或构造函数入参注入动态值。下面以 Bean 属性使用 SpEL 表达式为例,如下:
图片.png
图片.png
在上述代码中,定义了 NumberGuess 和 ShapeGuess 两个 Bean, ShapeGuess 中的initialShapeSeed 属性通过表达式引用 NumberGuess 中定义的 randomNumber 属性。

9.5.2 基于注解的配置

示例1:–引用bean的属性

基于注解基于 Java 类配置的 Bean 中,可以通过@Value(“#{beanName.propName}”)的注解形式引用 Bean 的属性值。
图片.png
图片.png

示例2:–引用基本类型bean

@ComponentScan("com.cms")
public class AppConfig {
    
    

	@Bean
	public Number/String/Integer... number () {
    
    
		return 1;
	}
}

// =================
使用:
@Value("#{number}")
private Number b;

示例3:

@Value 注解可以标注在类的属性、方法及构造器函数上,用于从配置文件中加载一个参数值。下面是一个设置属性示例:
图片.png
图片.png
细心的读者可能会发现,类似“#(properties[password]}”这种写法比较容易出错。Spring 提供了一种更简便的写法——属性占位符,只要在 Spring 的配置方法中添加一个‘property-placeholder”,就可以在表达式中使用“${属性}”,如下:
图片.png

9.6 小结

在实际项目开发中,对于动态表达式的需求场景还是比较多的。早期,大家可能会在 Java 中引入一些动态脚本语言如 Rhino、 Jython、 JRuby 等类库来实现。虽然这些动态脚本语言可以实现各类复杂的表达式需求,但需要自行封装实现,工作量很大。
SpEL 表达式的出现为我们提供了一个轻量级的表达式框架,它实现了一套丰富的操作表达式,支持文本、对象、集合、方法表达式解析,并提供了丰富的表达式操作,可以满足大多数表达式场景需求。SpEL 已深入整合到 Spring 框架的 Bean 配置中,使用SpEL 可以完成众多高级的 Bean 配置问题。

猜你喜欢

转载自blog.csdn.net/qq_43783527/article/details/129407492
今日推荐