Spring Boot 搭配 QLExpress 动态脚本引擎,解锁复杂业务逻辑新玩法!

开发 前端
QLExpress 作为一款轻量级、功能强大的动态脚本引擎,为 Java 开发者提供了一种高效、灵活的方式来实现复杂业务逻辑。结合 Spring Boot 3.4,可以让业务规则动态调整,而无需修改核心代码,极大地提高了系统的扩展性。

在现代企业级应用中,业务规则的灵活性至关重要。规则引擎的引入,使得系统可以通过动态配置的方式管理业务逻辑,而不需要频繁修改代码,从而提升了系统的可维护性与可扩展性。

在众多规则引擎方案中,QLExpress 以其简洁的语法、高效的执行性能以及强大的扩展能力,成为一个颇具竞争力的选择。QLExpress 由阿里巴巴开发,广泛应用于电商、金融等高并发场景,支持布尔逻辑、数学运算、表达式解析以及动态脚本执行。

QLExpress 的主要特性

  • 线程安全脚本运行时的临时变量基于 ThreadLocal 机制,保证了并发安全。
  • 高效执行支持脚本编译缓存机制,并利用变量池优化运行时临时变量的创建,与 Groovy 运行效率相当。
  • 弱类型脚本语言语法风格类似于 JavaScript 和 Groovy,提高了业务逻辑的灵活性。
  • 安全机制提供防止死循环、高危 API 调用等安全控制措施。
  • 轻量级核心依赖包体积仅 250KB,适用于所有 Java 运行环境。

接下来,我们将基于 Spring Boot 3.4 介绍如何集成和使用 QLExpress。

QLExpress 实战

引入依赖

在 pom.xml 文件中添加以下依赖:

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

无需额外配置,即可在项目中直接使用 QLExpress。

基本示例

下面是一个简单的示例,展示如何使用 QLExpress 进行数学运算:

package com.icoderoad.qlexpress;


import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;


public class QLExpressDemo {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        DefaultContext<String, Object> context = new DefaultContext<>();


        context.put("a", 1);
        context.put("b", 2);
        context.put("c", 3);


        String express = "a + b * c";
        Object result = runner.execute(express, context, null, true, false);


        System.out.printf("%s = %s%n", express, result);
    }
}

运行上述代码,将输出:

a + b * c = 7

可以看到,QLExpress 语法类似于 Java 的表达式计算方式,使用起来非常直观。

语法规则

QLExpress 支持如下运算符:

  • 算术运算+ - * / % mod(取模)
  • 比较运算< > <= >= == != <>
  • 逻辑运算&& || !
  • 流程控制if else、for、break、continue

示例:计算 1 到 n 的累加和

String express = """
    for(i = 1; i <= n; i++) {
        sum = sum + i;
    }
    return sum;
""";

对象操作

QLExpress 允许在表达式中创建和操作 Java 对象:

String express = """
    import com.icoderoad.service.PersonService;
    import com.icoderoad.model.Person;
    
    ps = new PersonService();
    ps.save(new Person());
""";

自定义函数

我们可以在表达式中定义函数,提高代码复用性:

String express = """
    function add(int a, int b) {
        return a + b;
    }
    return Math.PI + add(arg1, arg2);
""";

关键字别名

QLExpress 允许开发者自定义关键字的别名,使表达式更加易读。

runner.addOperatorWithAlias("如果", "if", null);
runner.addOperatorWithAlias("否则", "else", null);
runner.addOperatorWithAlias("返回", "return", null);
String express = "如果(a > b) { 返回 1; } 否则 { 返回 0; }";

绑定 Java 方法

我们可以将 Java 方法绑定到 QLExpress,方便在表达式中调用:

runner.addFunctionOfClassMethod("四舍五入", CommonService.class, "roundUp", new Class[]{double.class}, null);
String express = "四舍五入(56.54788)";
Object result = runner.execute(express, null, null, true, false);

宏定义

宏定义类似于表达式模板,可以简化复杂计算:

runner.addMacro("计算平均成绩", "(语文 + 数学 + 英语) / 3.0");
runner.addMacro("是否优秀", "计算平均成绩 > 90");

变量查询

QLExpress 允许我们获取表达式中使用的变量列表,以便动态分析:

String express = """
    int ret = (a + b + Math.PI * c ) / 4;
    return ret;
""";
String[] vars = runner.getOutVarNames(express);
for (String var : vars) {
    System.out.printf("var: %s%n", var);
}

结语

QLExpress 作为一款轻量级、功能强大的动态脚本引擎,为 Java 开发者提供了一种高效、灵活的方式来实现复杂业务逻辑。结合 Spring Boot 3.4,可以让业务规则动态调整,而无需修改核心代码,极大地提高了系统的扩展性。

希望本文的讲解能够帮助你更好地理解和使用 QLExpress,在项目中灵活运用它的强大功能!

责任编辑:武晓燕 来源: 路条编程
相关推荐

2025-02-04 11:30:10

2023-05-30 07:56:23

代码软件开发

2014-09-11 15:05:40

驱动设计驱动开发

2020-09-27 14:24:58

if-else cod业务

2023-07-17 18:39:27

业务系统架构

2022-04-07 17:30:31

Flutter携程火车票渲染

2022-07-04 19:02:06

系统业务思考

2024-12-20 19:38:01

ToB业务状态转换

2022-10-26 07:14:25

Spring 6Spring业务

2017-04-21 07:41:37

iOS自动化测试容器

2019-08-14 08:52:40

业务代码运营

2023-02-24 18:47:37

供应链实时数仓

2025-02-25 08:00:00

SpringBootLua开发

2024-07-18 19:30:58

2017-06-05 15:08:14

容量全链路流量

2024-09-26 16:48:10

点赞
收藏

51CTO技术栈公众号