Spring Boot 搭配 QLExpress 動態(tài)腳本引擎,解鎖復雜業(yè)務邏輯新玩法!
在現代企業(yè)級應用中,業(yè)務規(guī)則的靈活性至關重要。規(guī)則引擎的引入,使得系統可以通過動態(tài)配置的方式管理業(yè)務邏輯,而不需要頻繁修改代碼,從而提升了系統的可維護性與可擴展性。
在眾多規(guī)則引擎方案中,QLExpress 以其簡潔的語法、高效的執(zhí)行性能以及強大的擴展能力,成為一個頗具競爭力的選擇。QLExpress 由阿里巴巴開發(fā),廣泛應用于電商、金融等高并發(fā)場景,支持布爾邏輯、數學運算、表達式解析以及動態(tài)腳本執(zhí)行。
QLExpress 的主要特性
- 線程安全腳本運行時的臨時變量基于 ThreadLocal 機制,保證了并發(fā)安全。
- 高效執(zhí)行支持腳本編譯緩存機制,并利用變量池優(yōu)化運行時臨時變量的創(chuàng)建,與 Groovy 運行效率相當。
- 弱類型腳本語言語法風格類似于 JavaScript 和 Groovy,提高了業(yè)務邏輯的靈活性。
- 安全機制提供防止死循環(huán)、高危 API 調用等安全控制措施。
- 輕量級核心依賴包體積僅 250KB,適用于所有 Java 運行環(huán)境。
接下來,我們將基于 Spring Boot 3.4 介紹如何集成和使用 QLExpress。
QLExpress 實戰(zhàn)
引入依賴
在 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 的表達式計算方式,使用起來非常直觀。
語法規(guī)則
QLExpress 支持如下運算符:
- 算術運算+ - * / % mod(取模)
- 比較運算< > <= >= == != <>
- 邏輯運算&& || !
- 流程控制if else、for、break、continue
示例:計算 1 到 n 的累加和
String express = """
for(i = 1; i <= n; i++) {
sum = sum + i;
}
return sum;
""";
對象操作
QLExpress 允許在表達式中創(chuàng)建和操作 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 允許開發(fā)者自定義關鍵字的別名,使表達式更加易讀。
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("是否優(yōu)秀", "計算平均成績 > 90");
變量查詢
QLExpress 允許我們獲取表達式中使用的變量列表,以便動態(tài)分析:
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 作為一款輕量級、功能強大的動態(tài)腳本引擎,為 Java 開發(fā)者提供了一種高效、靈活的方式來實現復雜業(yè)務邏輯。結合 Spring Boot 3.4,可以讓業(yè)務規(guī)則動態(tài)調整,而無需修改核心代碼,極大地提高了系統的擴展性。
希望本文的講解能夠幫助你更好地理解和使用 QLExpress,在項目中靈活運用它的強大功能!