好问题 👍 阿杰,你问的是 QLExpress(Quick Logic Express),这是一个国产的 Java 动态脚本引擎,在金融、电商、风控、推荐等系统里用得比较多。下面我给你系统讲解:


🚀 动态脚本引擎 QLExpress 详解

1. QLExpress 是什么?

QLExpress(Quick Logic Express)是阿里开源的一款 轻量级脚本引擎,用来在 Java 程序中动态执行逻辑脚本。

📌 它的主要特点:

  • 语法接近 Java(学习成本低)。
  • 可配置、安全沙箱(限制不安全操作)。
  • 支持自定义函数、操作符、宏命令。
  • 动态执行:无需重新编译 Java 代码。

👉 一句话:把业务逻辑交给脚本,让规则可以热更新,而不是改代码、发版。


2. 为什么需要 QLExpress?

在复杂业务中(比如风控规则、推荐算法、营销活动),逻辑经常变化,如果全部写死在 Java 里:

  • 每次改规则都要改代码 + 部署 → 代价大、效率低。
  • 运营人员无法直接修改规则。

引入 QLExpress 后

  • 规则用脚本写,存数据库或配置中心。
  • Java 调用引擎运行脚本 → 动态执行逻辑。
  • 不需要重新发版,灵活性高。

3. QLExpress 基本用法

3.1 引入依赖

Maven:

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>QLExpress</artifactId>
  <version>3.3.1</version>
</dependency>

3.2 Hello World

import com.ql.util.express.ExpressRunner;

public class Demo {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        String express = "1+2*3";
        Object result = runner.execute(express, null, null, true, false);
        System.out.println(result); // 输出 7
    }
}


4. 常用功能

4.1 变量传递

Map<String, Object> context = new HashMap<>();
context.put("a", 10);
context.put("b", 5);

String express = "a + b * 2";
Object result = runner.execute(express, context, null, true, false);
System.out.println(result); // 20


4.2 自定义函数

runner.addFunction("max", new Operator() {
    @Override
    public Object executeInner(Object[] list) {
        return Math.max((Integer) list[0], (Integer) list[1]);
    }
});

String express = "max(3,8)";
Object result = runner.execute(express, null, null, true, false);
System.out.println(result); // 8


4.3 自定义操作符

runner.addOperator("add", new Operator() {
    @Override
    public Object executeInner(Object[] list) {
        return (Integer) list[0] + (Integer) list[1];
    }
});

String express = "5 add 10";
System.out.println(runner.execute(express, null, null, true, false)); // 15


4.4 控制流

QLExpress 支持类 Java 的 if、for、while:

String express =
        "sum = 0;" +
        "for(i=0;i<5;i++){" +
        "   sum = sum + i;" +
        "}" +
        "return sum;";

System.out.println(runner.execute(express, null, null, true, false)); // 10


5. QLExpress 在业务中的应用

  • 风控引擎
    规则写成脚本,比如 if (amount > 10000 && userLevel < 3) return false;
  • 推荐系统
    动态权重计算,例如 score = click*0.6 + like*0.4;
  • 活动引擎
    配置优惠规则 if (orderAmount > 200) return discount=20;

这样,运营人员只改脚本,不需要程序员重新发版


6. QLExpress 优缺点

✅ 优点:

  • 学习成本低(语法接近 Java)。
  • 动态性强,可热更新规则。
  • 支持函数、操作符扩展。

⚠️ 缺点:

  • 性能比直接写 Java 稍差(但能接受)。
  • 脚本过于复杂时可读性差。
  • 安全需要注意(要限制危险方法调用)。

7. 与其他脚本引擎对比

  • Groovy:功能强大,适合 DSL,但学习成本高。
  • MVEL:轻量但社区弱。
  • JSR-223(内置 JavaScript 引擎 Nashorn):通用,但性能一般。
  • QLExpress国产 + 简单 + 快速上手,特别适合规则引擎。

✨ 总结:
QLExpress 是 Java 项目中快速实现动态规则的利器,非常适合风控、活动、推荐场景。你只要在 Java 中调用引擎,业务逻辑就可以完全写在脚本里,后期调整非常灵活。


好 👌 阿杰,那我就给你写一个 电商优惠规则引擎 Demo(基于 QLExpress),让你直观感受它在真实业务场景中的用法。


🛒 电商优惠规则引擎 Demo

1. 场景设定

  • 用户下单时,系统要根据 优惠规则 动态计算优惠金额。
  • 规则可能是:
    • 满减:满 200 减 20
    • VIP 用户额外 10% 折扣
    • 节日活动:满 500 减 100

👉 这些逻辑可能经常改,不想每次都重新发版,所以放在 QLExpress 脚本里。


2. Maven 依赖

&lt;dependency>
    &lt;groupId>com.alibaba&lt;/groupId>
    &lt;artifactId>QLExpress&lt;/artifactId>
    &lt;version>3.3.1&lt;/version>
&lt;/dependency>


3. Java 代码示例

import com.ql.util.express.ExpressRunner;

import java.util.HashMap;
import java.util.Map;

public class DiscountEngineDemo {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();

        // 模拟上下文:订单金额、用户等级、节日标识
        Map&lt;String, Object> context = new HashMap&lt;>();
        context.put("orderAmount", 520.0);
        context.put("userLevel", 2); // 1=普通用户, 2=VIP
        context.put("isFestival", true);

        // 定义规则脚本(可存数据库/配置中心)
        String ruleScript =
                "discount = 0;" +
                "if (orderAmount >= 200) { discount = discount + 20; }" +
                "if (userLevel == 2) { discount = discount + orderAmount * 0.1; }" +
                "if (isFestival &amp;&amp; orderAmount >= 500) { discount = discount + 100; }" +
                "return discount;";

        // 执行规则
        Object discount = runner.execute(ruleScript, context, null, true, false);
        System.out.println("订单原价: " + context.get("orderAmount"));
        System.out.println("优惠金额: " + discount);
        System.out.println("支付金额: " + ((Double) context.get("orderAmount") - (Double) discount));
    }
}


4. 运行结果示例

假设订单金额 520,用户等级 VIP(2),节日活动:

订单原价: 520.0
优惠金额: 172.0
支付金额: 348.0

计算过程:

  • 满 200 减 20 → -20
  • VIP 用户 10% → -52
  • 节日满 500 减 100 → -100
  • 合计优惠 172

5. 优化点

  • 规则热更新:脚本存数据库,运营人员改完直接生效。
  • 脚本管理:可配合后台界面编辑。
  • 安全控制:通过 runner.addWhiteClass / addWhiteMethod 限制能调用的类和方法。

✨ 这样,你就能把复杂的优惠规则交给 QLExpress 脚本来处理,业务逻辑可配置、灵活、低耦合。

好 👌 阿杰,那我帮你把 单条优惠规则 Demo 升级成一个 支持多条规则组合执行的优惠规则引擎框架。这样你就能像真正的“规则引擎”一样管理和运行多条规则。


🛒 电商优惠规则引擎(支持多条规则)

1. 场景设定

  • 电商优惠活动可能有很多条规则:
    1. 满 200 减 20
    2. VIP 用户 10% 折扣
    3. 节日满 500 减 100
    4. 新用户下单立减 50
  • 一个订单可能需要跑 多条规则,然后把优惠结果汇总。

2. 核心设计思路

  • 每条规则都是一段 QLExpress 脚本
  • 所有规则存放在一个 List<String> 或数据库里。
  • 遍历执行所有规则 → 汇总优惠金额。

3. Java 实现代码

import com.ql.util.express.ExpressRunner;

import java.util.*;

public class MultiRuleDiscountEngine {

    private final ExpressRunner runner;

    public MultiRuleDiscountEngine() {
        this.runner = new ExpressRunner();
    }

    /**
     * 执行多条规则,汇总优惠金额
     */
    public double calculateDiscount(Map&lt;String, Object> context, List&lt;String> rules) throws Exception {
        double totalDiscount = 0;

        for (String rule : rules) {
            Object result = runner.execute(rule, context, null, true, false);
            if (result instanceof Number) {
                totalDiscount += ((Number) result).doubleValue();
            }
        }

        return totalDiscount;
    }

    public static void main(String[] args) throws Exception {
        MultiRuleDiscountEngine engine = new MultiRuleDiscountEngine();

        // 模拟订单上下文
        Map&lt;String, Object> context = new HashMap&lt;>();
        context.put("orderAmount", 520.0);
        context.put("userLevel", 2); // 1=普通用户, 2=VIP
        context.put("isFestival", true);
        context.put("isNewUser", true);

        // 定义多条规则(可以存数据库)
        List&lt;String> rules = Arrays.asList(
                // 满减
                "if (orderAmount >= 200) return 20; else return 0;",
                // VIP 折扣
                "if (userLevel == 2) return orderAmount * 0.1; else return 0;",
                // 节日活动
                "if (isFestival &amp;&amp; orderAmount >= 500) return 100; else return 0;",
                // 新用户优惠
                "if (isNewUser) return 50; else return 0;"
        );

        // 执行规则引擎
        double discount = engine.calculateDiscount(context, rules);
        double payAmount = (Double) context.get("orderAmount") - discount;

        // 输出结果
        System.out.println("订单原价: " + context.get("orderAmount"));
        System.out.println("优惠金额: " + discount);
        System.out.println("支付金额: " + payAmount);
    }
}


4. 运行结果示例

订单原价: 520.0
优惠金额: 222.0
支付金额: 298.0

计算过程:

  • 满 200 减 20 → -20
  • VIP 10% 折扣 (520*0.1=52) → -52
  • 节日满 500 减 100 → -100
  • 新用户立减 50 → -50
  • 合计优惠 222

5. 可扩展方向

  1. 规则持久化:把 rules 存到数据库,运营人员可在后台配置。
  2. 规则分组:支持不同活动类型(满减 / 折扣 / 优惠券)。
  3. 规则优先级:给规则加权重或优先级,避免冲突。
  4. 规则调试:提供一个“沙箱模式”来单独跑规则。

✨ 现在你已经有一个 支持多条规则动态组合执行 的优惠规则引擎了,可以灵活应对电商活动。