分析器配置和SpEL编译
工具/原料
1
spring
2
IntelliJ
方法/步骤
1
可以使用解析器配置对象(org.springframework.expression.spel.SpelParserConfiguration)配置SpEL表达式解析器。配置对象控制某些表达式组件的行为。例如,如果索引到数组或集合并且指定索引处的元素是null,则可以自动创建该元素。当使用由一系列属性引用组成的表达式时,这很有用。
2
如果索引到数组或列表并指定超出数组或列表当前大小末尾的索引,则可以自动增大数组或列表以适应该索引。以下示例演示如何自动增长列表:
3
Spring Framework 4.1包含一个基本的表达式编译器。表达式通常被解释,在评估期间提供了很多动态灵活性,但是没有提供最佳性能。对于偶尔的表达式使用,这很好,但是,当其他组件(如Spring Integration)使用时,性能可能非常重要,并且不需要动态。
4
SpEL编译器旨在满足此需求。在评估期间,编译器生成一个Java类,该类在运行时体现表达式行为,并使用该类来实现更快的表达式评估。由于缺少表达式类型,编译器使用在执行编译时对表达式的解释评估期间收集的信息。
5
例如,它不完全从表达式中知道属性引用的类型,但在第一次解释的求值期间,它会发现它是什么。当然,如果各种表达元素的类型随时间变化,那么基于这种派生信息的编译可能会导致麻烦。因此,编译最适合于类型信息在重复评估时不会改变的表达式。
6
请考虑以下基本表达式:
7
因为前面的表达式涉及数组访问,某些属性取消引用和数字操作,所以性能增益非常明显。在一个50000次迭代的微基准测试示例中,使用解释器进行评估需要75ms,使用表达式的编译版本只需要3ms。