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

相关推荐

  1. SpringEL表达式编译模式SpelCompilerMode详解

    2024-05-01 03:26:05       12 阅读
  2. texStudio用Springer模板排坑

    2024-05-01 03:26:05       23 阅读
  3. C# 异步编程模式详解

    2024-05-01 03:26:05       15 阅读
  4. shell编程系列(14)-正则表达式详解

    2024-05-01 03:26:05       37 阅读
  5. Cron表达式详解

    2024-05-01 03:26:05       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-01 03:26:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-01 03:26:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-01 03:26:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-01 03:26:05       18 阅读

热门阅读

  1. 洛谷 P1179 [NOIP2010 普及组] 数字统计

    2024-05-01 03:26:05       11 阅读
  2. 2024年4月个人工作生活总结

    2024-05-01 03:26:05       11 阅读
  3. LeetCode-104-二叉树最大深度

    2024-05-01 03:26:05       13 阅读
  4. clickhouse升级

    2024-05-01 03:26:05       16 阅读
  5. springboot615基于springboot的旅游出行指南_655ms--论文

    2024-05-01 03:26:05       14 阅读