1. QLExpress Java动态脚本引擎概述
QLExpress是阿里巴巴开源的一款轻量级Java动态脚本引擎,专门设计用于处理需要动态逻辑的场景。作为一名长期使用Java进行企业级开发的工程师,我发现这类动态脚本引擎在实际项目中能解决很多棘手的问题。比如当业务规则频繁变更时,传统的硬编码方式往往需要重新部署应用,而使用QLExpress则可以实现规则的动态加载和执行。
这个引擎的核心优势在于其轻量级特性和高性能表现。它不依赖任何第三方库,整个jar包只有几百KB大小,却能提供完整的脚本解析和执行能力。在我的项目经验中,QLExpress的脚本执行速度可以达到原生Java代码的1/10到1/5,这对于大多数业务场景来说已经足够高效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础使用
2.1 项目依赖配置
要在项目中使用QLExpress,首先需要添加Maven依赖。目前最新稳定版本是3.3.4,这也是我在生产环境中验证过的版本:
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.3.4</version>
</dependency>
如果你使用的是Gradle,可以这样配置:
groovy复制implementation 'com.alibaba:QLExpress:3.3.4'
2.2 核心API介绍
QLExpress的核心类是ExpressRunner,它负责脚本的编译和执行。创建实例时可以通过构造函数参数配置一些重要选项:
java复制// 基本配置
ExpressRunner runner = new ExpressRunner();
// 带参数的配置(推荐)
ExpressRunner runner = new ExpressRunner(true, false);
// 第一个参数:是否开启语法检查
// 第二个参数:是否开启缓存(对性能敏感场景建议开启)
另一个重要类是DefaultContext,用于向脚本传递参数。它本质上是一个Map结构,但做了一些特定于QLExpress的优化:
java复制DefaultContext<String, Object> context = new DefaultContext<>();
context.put("a", 10);
context.put("b", 20);
2.3 执行第一个脚本
有了runner和context,就可以执行简单的脚本了:
java复制Object result = runner.execute("a + b", context, null, true, false);
System.out.println(result); // 输出30
execute方法的参数说明:
- 脚本内容
- 上下文对象
- 错误列表(用于收集执行过程中的错误)
- 是否缓存
- 是否输出日志
3. 高级功能详解
3.1 自定义函数注入
在实际业务中,我们经常需要在脚本中调用特定的业务逻辑。QLExpress提供了多种方式来实现这一点。
3.1.1 添加简单函数
java复制runner.addFunction("isAdult", new Operator() {
@Override
public Object executeInner(Object[] list) {
Integer age = (Integer) list[0];
return age != null && age >= 18;
}
});
// 脚本中使用
Object result = runner.execute("isAdult(20)", context, null, true, false);
// 返回true
3.1.2 注入对象方法
java复制// 假设我们有一个StringUtil工具类
public class StringUtil {
public static boolean isEmpty(String str) {
return str == null || str.trim().isEmpty();
}
}
// 注入静态方法
runner.addFunctionOfClassMethod("isEmpty",
StringUtil.class.getName(),
"isEmpty",
new Class[]{String.class},
null);
// 脚本中使用
Object result = runner.execute("isEmpty('')", context, null, true, false);
// 返回true
3.2 宏定义功能
对于频繁使用的复杂表达式,可以定义为宏来简化脚本编写:
java复制runner.addMacro("高风险交易", "amount > 10000 && (isForeign || isHighRiskCountry)");
