QLExpress使用及源码分析

简介: QLExpress是阿里开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑与代码解耦。结合实体别名、接口规则定义及脚本化表达式,实现动态计算与判断,如用户年龄判断、BMI计算等。支持AST语法树解析与上下文绑定,提供灵活的二次扩展能力,适用于复杂业务场景的延迟执行与缓存优化。

Git仓库:https://github.com/alibaba/QLExpress
1.示例Demo
1.实体构建
@Data
public class User {

@QLAlias("姓名")
private String name;

@QLAlias("年龄")
private Integer age;

@QLAlias("性别")
private String gender;

@QLAlias("身高")
private Double height;

@QLAlias("体重")
private Double weight;

}
2.接口定义
@Service(value = "userManagerImpl")
public class UserManagerImpl implements UserManager {

... ...

@Override
@QLRule("isAdult")
public Boolean isAdult(@QLAlias("用户") User user) {
throw new RuntimeException("不应该走到这里");
}

@Override
@QLRule
public BMIResult calculate(@QLAlias("用户") User user) {
throw new RuntimeException("不应该走到这里");
}
}
3.脚本编写
表达式内容维护在一个yaml里,默认扫描路径为:classpath:/rules/**/.yaml
这里为:user.yaml
// 对应上述接口1
isAdult:
用户.年龄 >= 18

// 对应上述接口2
com.test.UserManagerImpl.calculate: |
import com.test.Result;
bmiResult = new Result();
bmiValue = 用户.体重 / (患者.身高 * 患者.身高);
bmiResult.setBmiValue(bmiValue);
if (bmiValue < 18.5) {
bmiResult.setMsg("体重过低");
} else if (bmiValue > 23.9) {
bmiResult.setMsg("体重过高");
} else {
bmiResult.setMsg("体重正常");
}
return bmiResult;
2.运行环节
QLExpressRunner如下图所示,从语法树分析、上下文、执行过程三个方面提供二次定制的功能扩展。

1.获取原始脚本,参数
● QLRule中的value可以使用缺省值,对应yaml的key则为缺省值对应的ruleCode
● 存在默认读取文件路径:com.c2f.boot.starter.rule.engine.QLExpressProperties
● String rule为获取的原始脚本,后续基于此构建AST语法树

2.构建后续赋值上下文
● 没取别名,默认构建一组:形参:value
● 取别名,另构建一组:别名:value(后续yaml能汉化使用也是基于此)
● 所以默认构建的上下文数量 = 形参个数 1,有别名 = 形参个数 2

3.调用执行

延迟执行

默认第一次执行即缓存

构建AST语法树
基于:com.ql.util.express.parse.KeyWordDefine4Java 构建
选择匹配工厂

递归解析
分解为Word[]:"sum",”=“,”0“,”;“,"for","(","i",......
Word[]转化为List《ExpressNode》:每一个word变得有意义:常量、变量、符号、分割符号

解析第一行:请领状态 = 药品请领单.执行状态

解析第二行:执行计划状态 = 执行计划.当前执行状态,clearDataStack后续也会当做一个指令使用

解析第三行,不再是loadAttr而是LoadData
或需是引包则loadData,变量定义是LoadAttr,未研究

真正执行

基于不同指令进入不同的重写方法

清除栈内数据

执行完毕返回

相关文章
|
10月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过YAML配置表达式规则。支持AST语法树解析、上下文构建与动态执行,提供脚本缓存、别名映射、指令重写等扩展能力,适用于灵活的业务逻辑解耦与动态化控制。
|
11月前
|
人工智能 JSON Java
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
AI时代下,规则引擎的需求反而更旺盛。QLExpress4 通过全面重构,在性能、可观测性和AI友好性上大幅提升。
2696 15
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
|
7月前
|
人工智能 JavaScript API
喂饭级指南!OpenClaw(Clawdbot)阿里云/本地部署+新手必装5大核心 Skill 实战教程
GitHub星标量超越Linux、成为开源社区“星标之王”的OpenClaw(原Clawdbot),早已不是简单的聊天机器人——它更像一个“天才宝宝”,而Skills(技能包)就是让它快速成长的“乐高插件”。很多新手按教程完成部署后,发现OpenClaw只会基础对话,核心原因就是缺少关键Skill的加持:没有搜索技能,它就像“睁眼瞎”,依赖过时知识库胡言乱语;没有办公技能,它就只能“纸上谈兵”,无法落地执行实际任务。
1199 3
|
3月前
|
人工智能 运维 安全
阿里云通义千问大模型介绍:核心功能、性能优势、行业落地场景与官方定价解析
作为阿里云自主研发的**国产旗舰级通用AI大模型**,通义千问(Qwen)历经多次版本迭代,目前已形成Qwen3全系列模型矩阵,涵盖轻量极速、均衡通用、旗舰推理、多模态创作全梯度能力。依托阿里云万亿级算力底座与海量数据训练,千问大模型在逻辑推理、代码生成、长文本处理、多模态理解、复杂任务拆解等核心维度达到国内顶尖、国际一流水平,同时通过国家大模型标准符合性评测,具备合规性强、稳定性高、国产化适配完善、成本可控等核心优势,是目前国内个人创作、企业数字化、行业智能化改造落地最广泛的通用大模型。本文将全面详解2026版阿里云通义千问大模型的核心功能、差异化性能优势、全行业落地场景、官方最新价格明细
3037 1
|
10月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑解耦。基于AST语法树解析,提供上下文绑定、动态脚本执行与缓存机制,适用于复杂条件判断与计算场景,如BMI计算、用户规则校验等,具备高扩展性与易维护性。
|
10月前
|
缓存
QLExpress使用及源码分析
本文介绍基于QLExpress的规则引擎实现方案,涵盖实体构建、接口定义与脚本编写。通过@QLAlias注解映射字段别名,结合YAML配置规则表达式,实现逻辑解耦。运行时动态解析AST语法树,支持汉化变量与上下文绑定,并提供缓存与延迟执行机制,提升性能与灵活性。
204 0
QLExpress使用及源码分析
|
人工智能 IDE 程序员
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
这个容易让程序员上瘾的 Agentic Coding 平台有哪些上头的功能?对于小白开发者和资深开发者如何用好Qoder呢?
20658 6
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
|
10月前
|
缓存 Java 开发工具
QLExpress使用及源码分析
QLExpress是阿里巴巴开源的轻量级规则引擎,支持通过YAML配置规则脚本,结合注解实现Java方法与表达式映射。通过别名机制、AST解析和上下文赋值,实现灵活的动态逻辑执行,适用于复杂业务规则场景。
372 0
|
存储 算法 安全
SpringBoot 接口加密解密实现
【10月更文挑战第18天】