表达式引擎封装 - ExpressionUtil
# 表达式引擎封装 - ExpressionUtil
# 1. 介绍
ExpressionUtil
是 Hutool 提供的表达式计算工具,支持多个流行的表达式引擎,如 Aviator、Jexl3、MVEL、JfireEL、Rhino 和 SpEL 等。通过封装不同的表达式引擎,ExpressionUtil
提供了统一的 API,使得开发者能够轻松切换或替换表达式引擎,而无需修改业务代码。
# 2. 使用
# 2.1. 引入表达式引擎依赖
Hutool 支持多个表达式引擎,开发者可根据需要选择引入。以 Aviator
为例:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.3.3</version>
</dependency>
1
2
3
4
5
2
3
4
5
Hutool 会通过 SPI 机制自动识别已引入的表达式引擎并使用。
# 2.2. 使用 ExpressionUtil
执行表达式
import cn.hutool.core.lang.Dict;
import cn.hutool.extra.expression.ExpressionUtil;
public class ExpressionExample {
public static void main(String[] args) {
// 构建参数字典
Dict dict = Dict.create()
.set("a", 100.3)
.set("b", 45)
.set("c", -199.100);
// 执行表达式
Object result = ExpressionUtil.eval("a - (b - c)", dict);
// 输出结果: -143.8
System.out.println("表达式计算结果: " + result);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
API解析:
ExpressionUtil.eval(String expression, Map<String, Object> context)
:用于执行表达式,返回计算结果。expression
:待计算的表达式字符串。context
:表达式中使用的变量和对应的值,通常为Map<String, Object>
或Dict
对象。- 返回值:表达式计算结果,类型为
Object
。
实际开发场景:
- 在业务规则引擎、动态配置、数据处理等场景中,表达式引擎常被用来进行灵活的计算、条件判断和数据转换。
# 2.3. 自定义引擎执行表达式
当项目中引入了多个表达式引擎时,可以手动指定某个引擎进行表达式计算。以下示例使用 Jexl3 引擎:
import cn.hutool.core.lang.Dict;
import cn.hutool.extra.expression.ExpressionEngine;
import cn.hutool.extra.expression.engine.jexl.JexlEngine;
public class CustomEngineExample {
public static void main(String[] args) {
// 创建 Jexl3 表达式引擎
ExpressionEngine engine = new JexlEngine();
// 构建参数字典
Dict dict = Dict.create()
.set("a", 100.3)
.set("b", 45)
.set("c", -199.100);
// 执行表达式
Object result = engine.eval("a - (b - c)", dict);
// 输出结果: -143.8
System.out.println("表达式计算结果: " + result);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
API解析:
ExpressionEngine.eval(String expression, Map<String, Object> context)
:与ExpressionUtil.eval
类似,但此方法由自定义的引擎实例调用,灵活性更高。
实际开发场景:
- 在需要不同表达式引擎并存的复杂场景中,可根据具体需求手动指定引擎执行计算。
# 2.4. 创建自定义表达式引擎
自定义引擎需要实现 ExpressionEngine
接口并在项目的 META-INF/services/
目录下创建 SPI 文件:
- 实现自定义引擎:
import cn.hutool.extra.expression.ExpressionEngine;
import cn.hutool.core.lang.Dict;
public class CustomEngine implements ExpressionEngine {
@Override
public Object eval(String expression, Dict context) {
// 实现自定义表达式的解析和计算逻辑
// 示例:简单返回传入的表达式作为结果
return expression + " evaluated!";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 配置 SPI 文件:
在 META-INF/services/cn.hutool.extra.expression.ExpressionEngine
文件中添加自定义引擎的全类名:
com.yourproject.CustomEngine
1
API解析:
ExpressionEngine.eval(String expression, Dict context)
:实现此方法用于自定义表达式解析和计算。
实际开发场景:
- 当现有引擎不满足业务需求时,可以通过自定义引擎实现更复杂或特殊的表达式计算逻辑。
# 3. 总结
ExpressionUtil
提供了对多种表达式引擎的统一封装,开发者可以根据业务需求灵活选择和切换不同的引擎。在实际开发中,无论是简单的动态计算,还是复杂的规则引擎,都可以使用 ExpressionUtil
提供的便捷 API 进行表达式处理。同时,支持自定义引擎的能力也为开发者提供了极大的扩展性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08