博客
关于我
Spring 5 中文解析之核心篇-表达式(SpEL)
阅读量:711 次
发布时间:2019-03-21

本文共 3968 字,大约阅读时间需要 13 分钟。

Spring 表达式语言(SpEL)入门介绍

Spring Expression Language(简称 SpEL)是一种强大且灵活的表达式语言,由 Spring Framework 开发,广泛应用于运行时对象的查询和操作。它在 Spring 社区中的多个产品组合中都有广泛的支持,是定义 Bean 的表达方式的一种重要工具。以下将详细介绍 SpEL 的基本功能、使用方法以及在实际应用中的示例。


SpEL 的基本特性

SpEL 的语法类似于 Java 的 EL(Expression Language),但扩展了许多功能,主要包括以下几个方面:

1. 方法调用

SpEL 支持在表达式中直接调用方法,例如:

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

输出结果为 "Hello World!"。

2. 属性访问

属性可以通过点号访问,例如:

ExpressionParser parser = new SpelExpressionParser();EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();Inventor tesla = new Inventor("Nikola Tesla", "Serbian");String name = (String) parser.parseExpression("name").getValue(tesla);// 结果:name == "Nikola Tesla"

3. 数字和字符串操作

支持基本的数字运算、四舍五入、指数运算等,以及字符串的构造函数操作,例如:

ExpressionParser parser = new SpelExpressionParser();String upperCase = parser.parseExpression("new String('hello world').toUpperCase()").getValue(String.class);// 结果:"HELLO WORLD"

4. 类型转换

SpEL 支持通过 ConversionService 进行类型转换,例如:

class Simple {    public List
booleanList = new ArrayList<>();}Simple simple = new Simple();simple.booleanList.add(true); EVALUATION_CONTEXT配置为只读访问模式:EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();parser.parseExpression("booleanList[0]").setValue(context, simple, "false")// 结果:trueBoolean b = simple.booleanList.get(0);

5. 集合和映射操作

支持内联列表和映射,例如:

ExpressionParser parser = new SpelExpressionParser();List numbers = parser.parseExpression("{1,2,3,4}").getValue(List.class);List
list = parser.parseExpression("{'a','b'}").getValue(List.class);

SpEL 的主要用法

1. 在 Bean 定义中的应用

在 XML 或注解配置中使用 SpEL 表达式指定属性值或构造函数参数,例如:

或者使用注解:

public class ExampleBean {    @Value("#{ systemProperties['user.region'] }")    private String defaultLocale;}

2. 作为表达式评估工具

通过 SpEL 表达式可以对对象进行各种操作,例如评估布尔逻辑:

ExpressionParser parser = new SpelExpressionParser();EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();boolean isMember = parser.parseExpression("isMember('Nikola Tesla')").getValue(context, Boolean.class);

3. 方法调用和变量使用

可以通过 #variable 来引用变量,并在表达式中使用安全导航操作符避免 NullPointer:

EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();context.setVariable("queryName", "Nikola Tesla");Expression expression = parser.parseExpression("Name == 'IEEE' and isMember(#queryName)");String result = parser.parseExpression(expression).getValue(context, String.class);

SpEL 的核心组件

1. 解析器(ExpressionParser)

负责解析 SpEL 表达式字符串,例如:

ExpressionParser parser = new SpelExpressionParser();Expression exp = parser.parseExpression("'Hello World'");Object value = exp.getValue(); // 返回 "Hello World"

2. 评估上下文(EvaluationContext)

用于管理评估过程中的变量和类型转换策略。主要实现包括 SimpleEvaluationContextStandardEvaluationContext

3. 转换服务(ConversionService)

默认使用 Spring 内核的转换服务,可自定义扩展以支持特定类型转换。


SpEL 的编译器

从 Spring 4.1 开始,SpEL 提供了编译器来提高表达式评估的性能。编译器关心项目的动态性和稳定性,适用于高性能需求的场景,但无法编译所有类型复杂的表达式,主要适用于以下情况:

编译模式

  • OFF:少互动时使用。
  • IMMEDIATE:在第一次评估后立即编译。
  • MIXED:在多次评估后动态切换编译模式。

配置方式

通过 SpelParserConfiguration 配置编译模式和类加载器,例如:

SpelParserConfiguration config = new SpelParserConfiguration(SpelCompilerMode.IMMEDIATE, this.getClass().getClassLoader());SpelExpressionParser parser = new SpelExpressionParser(config);

SpEL 的实际应用示例

示例 1:评估属性值

Inventor inventor = new Inventor("Nikola Tesla");EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();String fullName = parser.parseExpression("name").getValue(inventor, String.class);// 结果:"Nikola Tesla"

示例 2:复杂表达式

List
numbers = parser.parseExpression("8 / 5 % 2").getValue(List.class);// 结果:[1]

SpEL 的优势

  • 灵活性:支持多种操作,包括方法调用、属性访问、布尔逻辑、集合操作等。
  • 安全性:通过安全导航操作符避免 NullPointer 错误。
  • 高性能:使用编译器大幅提升评估性能。
  • 通用性:适用于 XML、注解配置以及其他 Spring 组件。

  • 总结

    SpEL 是 Spring 表达式语言的核心工具,广泛应用于对象的动态操作、属性访问以及数据绑定。通过合理使用 SpEL,开发者可以大大提升代码的灵活性和 maintainability。如果需要更详细的技术文档,可以参考 Spring 官方资料或相关技术博客。

    转载地址:http://oldrz.baihongyu.com/

    你可能感兴趣的文章
    python编程基础之十六
    查看>>
    python字符串input输入_Python input()函数:获取用户输入的字符串
    查看>>
    python 对json数据读取及保存与读取,对dump,dumps,load,loads的理解
    查看>>
    Python 对mysql数据库的操作
    查看>>
    Python 对象数据库列表
    查看>>
    Python 导入requests报错No module named requests
    查看>>
    Python 将JPEG图片批量改成jpg并删除JPEG图片
    查看>>
    python 将函数加到列表中进行调用
    查看>>
    python 将图片与字符串相互转换
    查看>>
    Python 嵌套字典全面指南
    查看>>
    Python 工具v简介
    查看>>
    Python编程入门指南:从零开始探索编程的奇妙世界
    查看>>
    python 常见内置函数setattr、getattr、delattr、setitem、getitem、delitem
    查看>>
    Python 常见的错误类型和继承关系
    查看>>
    python 常量_零基础学Python系列之一:Python的变量与常量
    查看>>
    Python 并发编程
    查看>>
    Python编程入门基础及高级技能、Web开发、数据分析和机器学习与人工智能
    查看>>
    python 序列化操作
    查看>>
    Python 开发者,这 7 个 VS Code 插件极力推荐
    查看>>
    python手把手视频_硬货 | 手把手带你构建视频分类模型(附Python演练))
    查看>>