Spring (65)什么是Spring Expression Language(SpEL)

Spring Expression Language(SpEL)是一个强大的表达式语言,允许在运行时查询和操作一个对象图。SpEL是Spring框架的一个组成部分,提供了丰富的表达式用于运行时逻辑和数据操作。

SpEL 的核心功能

  • Literal Expressions(字面量表达式): 支持字符串、数字、布尔值和null。
  • Method Invocation(方法调用): 允许调用字符串的方法或者用户定义的方法。
  • Relational Operators(关系操作符): 包括标准的比较操作符(等于、不等于、大于等)。
  • Logical Operators(逻辑操作符): 包括逻辑运算符 andornot
  • Mathematical Operators(数学运算符): 支持标准的数学运算。
  • Property Access(属性访问): 允许直接访问对象的属性。
  • Array Construction(数组构造): 支持直接在表达式中定义数组。
  • Inline Lists(内联列表): 支持在表达式中定义列表。
  • Inline Maps(内联映射): 支持在表达式中定义映射。
  • Collection Selection(集合选择): 使用特定的语法从集合中选择元素。
  • Collection Projection(集合投影): 从集合的每个成员中提取信息。
  • Ternary Operator(三元运算符): 类似于Java的三元运算符。
  • Variables(变量): 支持定义和引用变量。
  • User defined functions(用户定义函数): 支持定义和调用用户自定义方法。
  • Bean References(Bean引用): 允许引用Spring容器中的Bean。
  • Array and List Indexing(数组和列表索引): 支持访问数组和集合中的元素。
  • Map Access(映射访问): 支持直接访问映射中的元素。

SpEL 使用示例

基本表达式
ExpressionParser parser = new SpelExpressionParser();// Literal
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();// Mathematical operator
int two = parser.parseExpression("1 + 1").getValue(Integer.class);// Method invocation
String bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String.class);// Relational operator
boolean trueValue = parser.parseExpression("2 == 2").getValue(Boolean.class);
在Spring应用上下文中使用SpEL
<!-- 在Spring配置文件中使用SpEL -->
<bean id="sampleBean" class="com.example.SampleBean"><property name="number" value="#{19 + 1}"/><property name="name" value="#{'Name of Bean' + ' Test'}"/>
</bean>
@Component
public class SampleBean {private int number;private String name;// getter和setter略
}
访问属性、调用方法和关系操作
public class Simple {public List<Boolean> booleanList = new ArrayList<Boolean>();
}Simple simple = new Simple();
simple.booleanList.add(true);EvaluationContext context = new StandardEvaluationContext(simple);// 访问属性
Boolean trueValue = parser.parseExpression("booleanList[0]").getValue(context, Boolean.class);// 方法调用
String bc = parser.parseExpression("'abc'.substring(1, 3)").getValue(String.class);// 关系运算
boolean trueValue = parser.parseExpression("1 < 2").getValue(Boolean.class);

深入源码

SpEL的实现依赖于几个核心类:

  • SpelExpressionParser: 解析表达式字符串,创建表达式对象。
  • StandardEvaluationContext: 定义表达式求值时使用的上下文信息。
  • SpelExpression: 表达式对象,代表解析后的SpEL表达式,可以在给定的上下文中求值。
  • PropertyAccessor: 定义访问对象属性的策略。
  • MethodResolver: 定义解析方法的策略。
解析过程

SpelExpressionParser为例,当调用parseExpression方法时,这个方法将会创建一个SpelExpression对象,并通过词法分析和语法分析(解析)过程构建表达式的AST(抽象语法树)。

public class SpelExpressionParser extends TemplateAwareExpressionParser {@Overrideprotected SpelExpression doParseExpression(String expressionString, @Nullable ParserContext context) throws ParseException {// 使用Antlr来进行语法分析和生成ASTSpelParserConfiguration config = new SpelParserConfiguration();SpelExpressionParser parser = new SpelExpressionParser(config);Expression expr = parser.parseRaw(expressionString);return (SpelExpression) expr;}
}

结论

SpEL提供了一种表达丰富、功能强大的方式来支持运行时查询和操作数据。它在Spring框架中广泛应用于配置、数据绑定和Web框架等多个领域,是Spring应用开发中不可或缺的工具之一。通过了解SpEL的架构和使用方式,开发者可以更好地利用Spring框架提供的强大功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet基础(续集2)

HttpServletResponse web服务器接收到客户端的http的请求&#xff0c;针对这个请求&#xff0c;分别创建一个代表请求的HttpServletRequest对象&#xff0c;代表响应的一个HttpServletResponse 如果要获取客户端请求过来的参数&#xff1a;找HttpServletRequest如果要给客户端…

【前端面试】二叉树递归模板和题解

递归模板和步骤 递归题目的通用步骤递归模板总结1. 树的遍历&#xff08;DFS&#xff09;2. 二叉树的最大深度3. 二叉树的最近公共祖先 递归题目的记忆技巧 递归题目的通用步骤 明确递归函数的功能&#xff1a;确定递归函数的输入参数和返回值&#xff0c;明确函数的功能。基准…

从入门到精通:Linux多线程

前言 多线程编程是现代计算机科学中至关重要的技术&#xff0c;它能够显著提升程序的并行性和性能。特别是在Linux环境中&#xff0c;多线程编程变得尤为重要&#xff0c;因为Linux提供了丰富的多线程支持。在这篇文章中&#xff0c;我们将深入探讨Linux多线程编程&#xff0c…

如何在本地部署ChatTTS? 完美部署 简单几步 cpu gpu cuda

前言 最近,24-05-27号,github上出现了一个新项目,ChatTTS。该项目提供了一个文本转语音(Text To Speech)的开源方案,同时支持中文和英文。在官网的演示视频中,可以看到合成效果高度接近真人。 到目前(06-04)为止,已经有18.3k的star。 那我们就来看看这个模型的基本…

判断一个矩形是否在一个多边形内部的python代码

要判断一个矩形是否在一个多边形内部&#xff0c;可以使用点在多边形内的判断方法。具体步骤如下&#xff1a; 1.定义多边形的顶点坐标列表&#xff08;多边形的每个顶点的x和y坐标&#xff09; 2.判断矩形的四个顶点是否都在多边形内部 下面是一个简单的Python代码示例来实现…

63、上海大学:MSConvNet-多尺度卷积神经网络解码大鼠运动疲劳数据[攒劲的模型来喽]

1、介绍&#xff1a; 文章&#xff1a;<A multiscale convolutional neural network based on time-frequency features for decoding rat exercise fatigue LFP >&#xff0c;本文由上海大学于2024.4.8日发表于<Biomedical Signal Processing and Control >&…

语音翻译软件app排名来啦,这些工具让旅游畅通无阻

#这个夏天我们一定要去看海# 出国旅行时&#xff0c;语言障碍常常是最让人头疼的问题之一。 特别是在像缅甸这样英语并不普及的国家&#xff0c;基本的日常交流&#xff0c;比如用餐或问路&#xff0c;都可能成为难题。 然而&#xff0c;随着技术的进步&#xff0c;现在有了…

全功能知识付费小程序源码系统 界面支持万能DIY装修 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代&#xff0c;知识付费已经成为一种重要的商业模式。为了满足市场对于便捷、高效、个性化的知识付费解决方案的需求&#xff0c;小编给大家分享一款全功能知识付费小程序源码系统。这一系统不仅具备界面支持万能 DIY 装修的独特优势&#xff0c;还配备…

游戏开发丨基于PyGame的消消乐小游戏

文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…

Cocos2dlua棋牌Lua解密

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍使用libcocos2dlua.so库的游戏的解密分析方法。” Cocos2dlua是一款流行的游戏引擎&#xff0c;常用于开发棋牌游戏。为了保护游戏代码&#xff0c;Cocos2dlua通常会对游戏脚本lua文件进行加密&#xff0c;生成Luac文件&…

电脑已删除的文件在回收站找不到怎么办?数据恢复办法分享!

电脑中的数据已经成为了我们生活和工作的重要部分。无论是珍贵的照片、重要的文档&#xff0c;还是日常的工作文件&#xff0c;我们都希望能够妥善保存很久。 然而&#xff0c;误删除文件的情况时有发生&#xff0c;而当我们急切地打开回收站试图找回这些文件时&#xff0c;却…

这些已经死去的软件,依旧无可替代

互联网这条长河里&#xff0c;软件们就像流星一样&#xff0c;一闪而过。有的软件火过一段时间&#xff0c;然后就慢慢消失了。 说不定有些软件你以前天天用&#xff0c;但不知道从什么时候开始就不再用了。时间一天天过去&#xff0c;我们的热情、记忆都在消退&#xff0c;还…

windows11 ssh 无法连接问题解决方法

问题描述 ssh wjxxx 报一下错误 CreateProcessW failed error:2 posix_spawn: No such file or directory 问题分析 原理 &#xff1a; known_hosts公钥文件客户端第一次访问服务器时候返回给客户端的密文&#xff0c;它生成的原则是根据名称和ip生成密文,连接时候客户端自…

[巨详细]使用HBuilder-X新建uniapp项目教程

文章目录 安装HBuilder-X启动uniapp项目其他&#xff1a;下载预览浏览器下载终端插件 安装HBuilder-X 详细步骤可看上文》》 启动uniapp项目 先打开HBuilder-X 点击新建项目 选择uniapp侧边栏&#xff0c;mian中的点击浏览 选择已经安装到本地的uniapp项目&#xff0c;并输…

数据分析中的数学:从基础到应用20240617

数据分析中的数学&#xff1a;从基础到应用 数据分析离不开数学的支持&#xff0c;统计学和概率论是其重要组成部分。本文将通过几个具体的实例&#xff0c;详细讲解数据分析中常用的数学知识&#xff0c;并通过Python代码演示如何应用这些知识。 1. 描述性统计 基本概念和用…

力扣1206--跳表

1206. 设计跳表 - 力扣&#xff08;LeetCode&#xff09; 挑战一下hard,果然难搞 参考 跳表的原理与实现 [图解]_跳表实现-CSDN博客 代码如下&#xff1a; struct Node{Node(Node* _right, Node* _down, int _val) :right(_right), down(_down), val(_val){}Node* right;No…

运营一个商城网站需要办理什么许可证?

搭建一个商城网站以下资质是必须要办理的&#xff1a;网站ICP备案以及增值电信业务经营许可证。 一、网站ICP备案 国家对提供互联网信息服务的ICP实行许可证制度。从而&#xff0c;ICP证成为网络经营的许可证&#xff0c;经营性网站必须办理ICP证&#xff0c;否则就属于非法经营…

[python日常]获取指定文件夹下,指定后缀的文件

要读取指定路径下所有以.mp3为后缀的文件名&#xff0c;并将它们存储在一个列表中 关键代码&#xff1a; os.path.splitext(“文件路径”) 分离文件名与扩展名&#xff1b;默认返回(fname,fextension)元组&#xff0c;可做分片操作filename.endswith(.mp3) 使用os.listdir…

做好六西格玛项目,效率翻倍不是事!——张驰咨询

六西格玛作为一种数据驱动、客户为中心的持续改进方法&#xff0c;旨在通过减少过程变异和缺陷&#xff0c;提升业务效率和产品质量。以下是六西格玛项目执行的专业流程&#xff1a; 1. 定义阶段&#xff08;Define&#xff09; 识别机会&#xff1a;明确项目范围和目标&#…

Stable Diffusion 3 Medium 正式开源,用户对此产品评价如何?

前两天 Stability.AI 终于开源了 Stable Diffusion 3&#xff0c;虽然只是中杯的 Medium 版本&#xff0c;没有放出当初宣布的 8B 版本[1]&#xff0c;但也在很多方面取得了进步。本想第一时间尝鲜测试&#xff0c;但这几天出差在外&#xff0c;使用颇不方便。 正好老朋友揽睿…