SpringEL表达式编译模式SpelCompilerMode详解

https://docs.spring.io/spring-framework/reference/core/expressions.html

在构建SpringEL表达式解析器时候,发现可以传递个SpelCompilerMode参数,这个值不传的话默认是OFF

// SpelParserConfiguration config = new SpelParserConfiguration();
SpelParserConfiguration config = new SpelParserConfiguration(SpelCompilerMode.IMMEDIATE, this.getClass().getClassLoader());
SpelExpressionParser spelExpressionParser = new SpelExpressionParser(config);
TemplateParserContext parserContext = new TemplateParserContext();
Expression expression = spelExpressionParser.parseExpression(spel, parserContext);
String value = expression.getValue(evaluationContext, String.class);

从名字上能看出, 这是对SpringEL表达式编译模式的一个设置。有如下三个枚举值
SpelCompilerMode#OFFSpelCompilerMode#IMMEDIATESpelCompilerMode#MIXED
看了下官方文档解释如下:
https://docs.spring.io/spring-framework/reference/core/expressions/evaluation.html#expressions-spel-compilation

SpEL编译

Spring 为 SpEL 表达式提供了一个基本的编译器。表达式通常被解释,这在评估过程中提供了很多动态灵活性,但不能提供最佳性能。对于偶尔使用表达式,这很好,但是,当由其他组件(例如 Spring Integration)使用时,性能可能非常重要,并且并不真正需要动态性。

SpEL 编译器旨在满足这一需求。在求值过程中,编译器会生成一个体现运行时表达式行为的 Java 类,并使用该类来实现更快的表达式求值。由于缺乏表达式周围的类型,编译器在执行编译时使用在表达式的解释求值期间收集的信息。例如,它并不纯粹从表达式知道属性引用的类型,但在第一次解释求值期间,它会找出它是什么。当然,如果各种表达式元素的类型随着时间的推移而改变,基于此类派生信息的编译可能会在以后引起麻烦。因此,编译最适合类型信息在重复求值时不会改变的表达式。

考虑以下基本表达式

someArray[0].someProperty.someOtherProperty < 0.1

由于前面的表达式涉及数组访问、一些属性取消引用和数值运算,因此性能提升非常明显。在运行 50,000 次迭代的示例微基准测试中,使用解释器进行评估需要 75 毫秒,而使用表达式的编译版本只需要 3 毫秒。

编译器配置

默认情况下,编译器未打开,但您可以通过两种不同的方式之一打开它。您可以通过使用解析器配置过程(前面讨论过)或在 SpEL 用法嵌入到另一个组件中时使用 Spring 属性来打开它。本节讨论这两个选项。

编译器可以以三种模式之一运行,这些模式在 org.springframework.expression.spel.SpelCompilerMode枚举中捕获。模式如下。

OFF(默认):编译器关闭。

IMMEDIATE:在立即模式下,表达式会尽快编译。这通常是在第一次解释评估之后。如果编译的表达式失败(通常是由于类型更改,如前所述),表达式求值的调用方会收到异常。

MIXED:在混合模式下,表达式会随着时间的推移在解释模式和编译模式之间默默切换。经过一定次数的解释运行后,它们会切换到编译形式,如果编译形式出现问题(例如类型更改,如前所述),表达式会自动再次切换回解释形式。稍后,它可能会生成另一个编译形式并切换到它。基本上,用户在IMMEDIATE模式下遇到的异常是在内部处理的。

IMMEDIATE存在模式是因为MIXED模式可能会导致具有副作用的表达式出现问题。如果编译表达式在部分成功后崩溃,则它可能已经做了一些影响系统状态的事情。如果发生这种情况,调用者可能不希望它以解释模式静默地重新运行,因为表达式的一部分可能会运行两次。

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

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

相关文章

uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时&#xff0c;不可避免的要用到可视化的数据管理后台&#xff0c;而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1&#xff0c;下载HBuilderX 开发者…

Portworx安装和使用

Portworx安装和使用 Portworx介绍 Portworx是一家美国存储初创公司&#xff0c;它研发了业界第一个容器定义存储系统Portworx。Portworx提供了全新的、统一的Scale out存储栈&#xff0c;其核心架构是共享的、松耦合的、分布式、基于元数据的块存储层(卷、块设备、全局共享卷…

【webrtc】MessageHandler 8: 基于线程的消息处理:处理音频输入输出断开

m98代码,看起来m114 去掉了MessageHandler :音频的录制和播放 都使用了on message,但只是用来通知并处理流的断开的。AAudioRecorder AAudioRecorder 处理流断开 OnErrorCallback :有可能 错误回调是别处来的,是其他线程, 但是这个错误的处理要再自己的线程执行: 音频播…

Go中为什么不建议用锁?

Go语言中是不建议用锁&#xff0c;而是用通道Channel来代替(不要通过共享内存来通信&#xff0c;而通过通信来共享内存)&#xff0c;当然锁也是可以用&#xff0c;锁是防止同一时刻多个goroutine操作同一个资源&#xff1b; GO语言中&#xff0c;要传递某个数据给另一个gorout…

JavaScript原型链深度剖析

目录 前言 一、原型链 1.原型链的主要组成 原型&#xff08;Prototype&#xff09; 构造函数&#xff08;Constructor&#xff09; 实例&#xff08;Instance&#xff09; 2.原型链的工作原理 前言 在JavaScript的世界中&#xff0c;原型链&#xff08;Prototype Chain&…

R语言的学习——day1

将数据框中某一列数据改成行名 代码 结果

第四十八节 Java 8 Nashorn JavaScript

Nashorn 一个 javascript 引擎。 从JDK 1.8开始&#xff0c;Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。它使用基于JSR 292的新语言特性&#xff0c;其中包含在JDK 7中引入的 invokedynamic&#xff…

.net core ef 连表查询

Information和TypeInfo连表查询 类似&#xff1a; select st.Title1,si.* from [Star_Information] si left join Star_TypeInfo st on si.typeId2st.id 先在EfCoreDbContext.cs配置 protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(b…

基于SSM的文物管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的文物管理系统拥有俩种角色 管理员&#xff1a;个人信息管理、用户管理、分类管理、文物信息管理、文物外借管理、文物维修管理、留言板管理等 用户&#xff1a;登录注册、分类…

[华为OD] C卷 服务器cpu交换 现有两组服务器QA和B,每组有多个算力不同的CPU 100

题目&#xff1a; 现有两组服务器QA和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能 力&#xff0c;B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等&#xff0c;允许从每组各选出一个CPU进行一次交换。 求两…

Linux 权限的简单讲解

1、前言 当我们分别使用 touch、mkdir 命令创建一名为 test1 的文件和名为 test2 的目录&#xff0c;发现其中有些参数不一样&#xff0c;本文就来给大家来剖析一下。 2、 参数讲解 我们可以通过切片分为下面几个区域&#xff0c;本文就只简单讲解文件类型、权限、所属用户、所…

github中fasttext库README官文文档翻译

参考链接&#xff1a;fastText/python/README.md at main facebookresearch/fastText (github.com) fastText模块介绍 fastText 是一个用于高效学习单词表述和句子分类的库。在本文档中&#xff0c;我们将介绍如何在 python 中使用 fastText。 环境要求 fastText 可在现代 …

http作业

综合练习&#xff1a;请给openlab搭建web网站 网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于www.openlab.com/student 网站访问学生信息…

CGAL 网格热力图

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里实现一个很有趣的功能,生成网格热力图,思路其实很简单:通过指定一个点,计算网格其他点到指定点的测地线距离,以此来为每个网格顶点进行赋色即可。 二、实现代码 //CGAL #include <CGAL/Simple_cartesi…

用HTML5实现播放gif文件

用HTML5实现播放gif文件 在HTML5中&#xff0c;你可以使用<img>标签来播放GIF文件。GIF文件本质上是一种图像格式&#xff0c;它支持动画效果&#xff0c;因此当在网页上加载时&#xff0c;它会自动播放动画。先看一个简单的示例&#xff1a; <!DOCTYPE html> &l…

Elasticsearch:探索 11 种流行的机器学习算法

作者&#xff1a;来自 Elastic Elastic Platform Team 过去几年中&#xff0c;机器学习&#xff08;ML&#xff09;已经悄然成为我们日常生活中不可或缺的一部分。它影响着从购物网站和流媒体网站上的个性化推荐&#xff0c;到保护我们的收件箱免受我们每天收到的大量垃圾邮件的…

2024年第二十六届“华东杯”(B题)大学生数学建模挑战赛|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看华东杯 (B题&#xff09;&#xff01; 第一个问题…

神经网络与深度学习(四)--自然语言处理NLP

这里写目录标题 1.序列模型2.数据预处理2.1特征编码2.2文本处理 3.文本预处理与词嵌入3.1文本预处理3.2文本嵌入 3.RNN模型3.1RNN概要3.2RNN误差反传 4.门控循环单元&#xff08;GRU&#xff09;4.1GRU基本结构 5.长短期记忆网络 (LSTM) 1.序列模型 分类问题与预测问题 图像分…

K8S安装Calico节点总是NotReady

问题场景&#xff1a; 今天部署了K8S主节点&#xff0c;Master节点安装了Calico网络插件&#xff0c;在运行node列表结果是NotReady&#xff1a; [rootmaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 22h v1.19.4…

关于chatgpt的理解与探索

引言 人工智能&#xff08;AI&#xff09;的发展一直以来都备受关注&#xff0c;而自然语言处理&#xff08;NLP&#xff09;领域的进展尤其引人瞩目。ChatGPT 作为其中的一员&#xff0c;以其强大的语言理解和生成能力而备受关注。本文将深入探讨 ChatGPT 的原理、应用以及对…