表达式引擎封装-ExpressionUtil
# 介绍
与模板引擎类似,Hutool针对较为流行的表达式计算引擎封装为门面模式,提供统一的API,去除差异。 现有的引擎实现有:
- Aviator (opens new window)
- Apache Jexl3 (opens new window)
- MVEL (opens new window)
- JfireEL (opens new window)
- Rhino (opens new window)
- Spring Expression Language (SpEL) (opens new window)
# 使用
首先引入我们需要的模板引擎,引入后,Hutool借助SPI机制可自动识别使用,我们以Aviator
为例:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.3.3</version>
</dependency>
# 执行表达式
final Dict dict = Dict.create()
.set("a", 100.3)
.set("b", 45)
.set("c", -199.100);
// -143.8
final Object eval = ExpressionUtil.eval("a-(b-c)", dict);
# 自定义引擎执行
如果项目中引入多个引擎,我们想选择某个引擎执行,则可以:
ExpressionEngine engine = new JexlEngine();
final Dict dict = Dict.create()
.set("a", 100.3)
.set("b", 45)
.set("c", -199.100);
// -143.8
final Object eval = engine.eval("a-(b-c)", dict);
# 创建自定义引擎
引擎的核心就是实现ExpressionEngine
接口,此接口只有一个方法:eval
。
我们实现此接口后,在项目的META-INF/services/
下创建spi文件cn.hutool.extra.expression.ExpressionEngine
:
com.yourProject.XXXXEngine
这样就可以直接调用ExpressionUtil.eval
执行表达式了。
上次更新: 2023/10/25, 14:44:30