精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

太強了!動態腳本引擎QLExpress,實現各種復雜的業務規則

開發 前端
在眾多規則引擎中,QLExpress以其簡潔的語法、高性能的執行能力和靈活的配置選項脫穎而出。它不僅能夠輕松應對復雜的業務邏輯,還提供了強大的擴展能力,滿足多樣化的開發需求。

環境:Spring2.7.18

1. 簡介

在復雜的業務環境中,規則引擎作為系統決策的核心,扮演著非常重要的角色。它們使業務邏輯能夠靈活調整。規則引擎通過解析和執行預設的規則,實現業務邏輯的自動化和智能化處理。這不僅提升了系統的靈活性和可擴展性,還大大簡化了業務邏輯的維護和管理。基于這樣的需求,尋求一個高效、易用的規則引擎是非常重要的。

在眾多規則引擎中,QLExpress以其簡潔的語法、高性能的執行能力和靈活的配置選項脫穎而出。它不僅能夠輕松應對復雜的業務邏輯,還提供了強大的擴展能力,滿足多樣化的開發需求。

QLExpress由阿里的電商業務規則、表達式(布爾組合)、特殊數學公式計算(高精度)、語法分析、腳本二次定制等強需求而設計的一門動態腳本引擎解析工具。

QLExpress特性:

  • 線程安全,引擎運算過程中的產生的臨時變量都是threadlocal類型。
  • 高效執行,比較耗時的腳本編譯過程可以緩存在本地機器,運行時的臨時變量創建采用了緩沖池的技術,和groovy性能相當。
  • 弱類型腳本語言,和groovy,javascript語法類似,雖然比強類型腳本語言要慢一些,但是使業務的靈活度大大增強。
  • 安全控制,可以通過設置相關運行參數,預防死循環、高危系統api調用等情況。
  • 代碼精簡,依賴最小,250k的jar包適合所有java的運行環境。
     

接下來將詳細介紹QLExpress的使用

2. 實戰案例

2.1 引入依賴

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

無需任何配置,可在項目中直接使用了

簡單示例

ExpressRunner runner = new ExpressRunner() ;
DefaultContext<String, Object> context = new DefaultContext<String, Object>() ;
context.put("a", 1) ;
context.put("b", 2) ;
context.put("c", 3) ;
String express = "a + b * c" ;
Object ret = runner.execute(express, context, null, true, false) ;
System.out.printf("%s = %d%n", express, ret) ;

用起來是不是與SpEL表達式差不多?

2.2 語法介紹

基礎語法

支持 +,-,*,/,<,>,<=,>=,==,!=,<>【等同于!=】,%,mod【取模等同于%】,++,--,in【類似sql】,like【sql語法】,&&,||,!,等操作符 

支持for,break、continue、if then else 等標準的程序控制邏輯

示例

ExpressRunner runner = ... ;
DefaultContext<String, Object> context = ... ;
context.put("n", 10) ;
context.put("sum", 0) ;
String express = """
    for(i = 1; i <= n; i++) {
       sum = sum + i;
    }
    return sum;
    """ ;
Object ret = runner.execute(express, context, null, true, false) ;
System.out.printf("表達式: %n%s計算結果: %d%n", express, ret) ;

輸出結果

圖片圖片

注意,與java語法相比以下是不支持的:

不支持try{}catch{} 

注釋目前只支持 /** **/,不支持單行注釋 // 

不支持java8的lambda表達式 

不支持for循環集合操作for (Item item : list) 

弱類型語言,請不要定義類型聲明,更不要用Template(Map<String, List>之類的) 

array的聲明不一樣 

min,max,round,print,println,like,in 都是系統默認函數的關鍵字,請不要作為變量名

對象操作

ExpressRunner runner = ... ;
DefaultContext<String, Object> context = ... ;
String express = """
      import com.pack.qlexpress.PersonService ;
      import com.pack.qlexpress.Person ;
      
      ps = new PersonService() ;
      ps.save(new Person()) ;
    """ ;
runner.execute(express, context, null, true, false) ;

輸出結果

PersonService save method, com.pack.Person@1c3a4799

相當于將java代碼以字符串形式表達出來。注意這里要導入所用到的包,即便在同一包中也要如此操作。

2.3 表達式定義函數

context.put("arg1", 10) ;
context.put("arg2", 20) ;
String express = """
      function add(int a, int b) {
        return a + b ;
      }
      return Math.PI + add(arg1, arg2) ;
    """ ;
Object ret = runner.execute(express, context, null, true, false) ;
System.out.printf("計算結果: %s%n", ret) ;

上面表達式中定義了add函數做加法運算,最終整個表達式調用add同時再加上Math.PI。對于java.lang包中的類不需要導入操作。

2.4 操作符

String express = """
    if(a > b) {
      return 1;
    } else {
      return 0;
    }
  """ ;
Object ret = runner.execute(express, context, null, true, false) ;
System.out.printf("計算結果: %s%n", ret) ;

上面表達式做if...else...判斷,輸出結果:

a <= b
計算結果: null // 沒有返回結果,所以為null

對于開發來說寫上面的表達式太簡單了,如果你非開發人員來寫if else或者其它更加復雜的語句那就太難為人了。qlexpress允許我們將這些關鍵字進行別名的定義,如下示例:

runner.addOperatorWithAlias("如果", "if", null) ;
runner.addOperatorWithAlias("否則", "else", null) ;
runner.addOperatorWithAlias("大于", ">", null) ;
runner.addOperatorWithAlias("返回", "return", null) ;
String express = "如果(a大于b){返回 1;} 否則 {返回 0;}";
Object ret = runner.execute(express, context, null, true, false) ;

上面代碼將程序中的關鍵字都通過漢字來別名化,這更加適應大眾應用。

2.5 綁定對象或Method

ExpressRunner runner = new ExpressRunner() ;
runner.addFunctionOfClassMethod("四舍五入", CommonService.class, "roundUp", new Class[] {double.class}, null);
String express = """
      四舍五入(56.54788)
    """ ;
Object ret = runner.execute(express, null, null, true, false) ;
System.out.printf("計算結果: %s%n", ret) ;

通過addFunctionOfClassMethod方法定義一個對象中的方法。輸出結果:

計算結果: 56.55

addFunctionOfClassMethod方法就是對類中的方法進行描述。

2.6 宏定義

ExpressRunner runner = new ExpressRunner() ;
runner.addMacro("計算平均成績", "(語文+數學+英語) / 3.0");
runner.addMacro("是否優秀", "計算平均成績 > 90");
DefaultContext<String, Object> context = new DefaultContext<String, Object>() ;
context.put("語文", 88) ;
context.put("數學", 99) ;
context.put("英語", 95) ;
Object ret = runner.execute("是否優秀", context, null, false, false);
System.out.printf("是否優秀: %s%n", ret) ;

輸出結果

是否優秀: true

以上宏的定義可以嵌套的調用。

2.7 查詢表達式變量

ExpressRunner runner = new ExpressRunner() ;
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) ;
}

輸出結果

var: a
var: b
var: c

以上將輸出當前表達式在執行時所需要傳入的變量。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2025-07-17 10:30:11

2025-01-13 13:47:13

2025-02-07 08:16:26

Java開發者代碼

2025-09-08 02:00:00

2025-04-17 02:00:00

2025-01-22 14:02:35

2025-09-01 02:00:00

2022-05-30 16:31:08

CSS

2025-02-08 08:00:00

JavaDeepSeekIDEA

2021-03-04 09:31:42

開源技術 項目

2023-12-10 20:33:50

Redis搜索全文

2025-07-02 08:00:00

防抖SpringBoot開發

2025-06-09 01:22:00

2022-06-08 08:01:28

模板字面量類型

2025-08-07 09:30:57

2024-01-30 09:21:29

CSS文字效果文字裝飾

2021-08-05 16:25:37

Windows 11Windows微軟

2023-03-06 08:03:10

Python可視化工具

2021-09-15 08:45:55

Python文本文件代碼

2021-02-03 20:19:08

Istio流量網格
點贊
收藏

51CTO技術棧公眾號

成人免费福利| 国产系列在线观看| 亚洲一级影院| 日韩精品一区二区三区第95| 国产裸体舞一区二区三区| 亚洲v国产v在线观看| 扒开jk护士狂揉免费| 成人av集中营| 亚洲午夜电影在线观看| 视频一区在线免费观看| 性一交一乱一透一a级| 美女国产精品| 久久97久久97精品免视看| 亚欧洲乱码视频| jizz性欧美2| 欧美区一区二区三区| 青青青免费在线| 日本a在线播放| 波多野结衣亚洲一区| 国产女精品视频网站免费| 天堂网一区二区三区| 天天做综合网| 国产午夜一区二区| 丝袜熟女一区二区三区| 亚洲国产伊人| 欧美制服丝袜第一页| 日韩伦理在线免费观看| 黄色精品免费看| 国产无一区二区| 加勒比在线一区二区三区观看| 在线观看免费视频一区| 西西人体一区二区| 欧美激情亚洲一区| 国产一区二区播放| 久久久久国产精品夜夜夜夜夜| 日本不卡免费高清视频在线| 亚洲女女做受ⅹxx高潮| 亚洲欧洲在线一区| 二区在线视频| 久久精品夜夜夜夜久久| 国产乱码精品一区二区三区中文| 国产精品一区二区黑人巨大| 日韩不卡免费视频| 国产精品久久一区| 成人小视频在线播放| 国产欧美欧美| 午夜免费久久久久| 福利一区二区三区四区| 欧美日韩1080p| 欧美另类高清videos| 国产精品免费人成网站酒店 | а_天堂中文在线| 亚洲天堂免费在线观看视频| 亚洲一卡二卡三卡| 日本福利专区在线观看| 中文在线一区二区| 亚洲五月六月| 麻豆影院在线| 日韩理论片一区二区| 懂色av粉嫩av蜜臀av| 18视频免费网址在线观看| 国产精品色噜噜| 亚洲一二三区精品| 中文在线字幕免费观看| 亚洲最色的网站| 三上悠亚久久精品| 在线观看涩涩| 欧美影院午夜播放| 国产精品v日韩精品v在线观看| 国产福利亚洲| 日韩一卡二卡三卡四卡| 午夜福利三级理论电影| 国产日韩三级| 亚洲小视频在线| 性少妇xx生活| 欧美成人综合| 97在线视频免费看| 午夜一级黄色片| 激情都市一区二区| av免费观看久久| 手机福利小视频在线播放| 91在线观看视频| 亚洲欧洲日夜超级视频| 爆操欧美美女| 欧美日韩国产精品专区| youjizzxxxx18| 欧美一区一区| 亚洲免费电影在线观看| 欧美性猛交xxxx乱大交少妇| 国产一区观看| 国产精品户外野外| 国产后入清纯学生妹| 99久久精品国产一区| 亚洲 国产 日韩 综合一区| av黄在线观看| 91国产视频在线观看| 国内av免费观看| 一区二区三区韩国免费中文网站| 色999日韩欧美国产| 日韩三级一区二区三区| 麻豆精品精品国产自在97香蕉 | 国产在线精品视频| 9a蜜桃久久久久久免费| 男人的天堂在线免费视频| 国产精品久久毛片a| 人妻少妇精品久久| 色999久久久精品人人澡69 | 久草在线免费福利资源| 亚洲精品视频在线看| 99久久久无码国产精品6| 伊人久久精品| 国产亚洲一区二区在线| 国产网址在线观看| 久久99国产精品尤物| 国产一区精品在线| 成人午夜在线影视| 91久久奴性调教| 亚洲麻豆一区二区三区| 天天综合网91| 国产精品国产三级国产专播精品人 | 日韩一区二区三区免费观看| 亚洲一区二区三区日韩| 在线日韩电影| 成人资源av| www.久久ai| 精品视频在线视频| 精品无码人妻一区| 国产精品日韩久久久| 97碰碰视频| 超碰在线观看免费| 在线不卡欧美精品一区二区三区| 精品人妻一区二区三区四区| 欧美亚洲专区| 精品欧美国产| 狠狠操一区二区三区| 亚洲电影免费观看| 国产一级中文字幕| 成人午夜在线播放| 热久久最新地址| 久久国产精品美女| 久久久国产精品亚洲一区| 亚洲天堂aaa| 国产精品久久久久影视| www.涩涩涩| av一区二区在线播放| 国产成人啪精品视频免费网| 国产对白叫床清晰在线播放| 色婷婷av一区二区三区大白胸| a级在线观看视频| 亚洲免费网站| 欧美日韩亚洲一区二区三区在线观看 | 午夜视频久久久久久| 中文字幕人妻一区| 亚洲精华国产欧美| 久久久com| 国产精品极品美女在线观看| 一区二区三区亚洲| 中文字幕视频在线播放| 中文字幕亚洲在| 一级网站在线观看| 在线成人亚洲| 欧美日韩国产一二| 久久人人视频| 欧美巨乳在线观看| 日韩一区免费视频| 欧美性猛交xxxx黑人猛交| 国产真人做爰视频免费| 麻豆成人91精品二区三区| 99久久久无码国产精品性色戒| 欧美日韩国产一区二区在线观看| 久久噜噜噜精品国产亚洲综合| 日韩在线视频第一页| 高跟丝袜欧美一区| 9.1片黄在线观看| 国产精品99久久久久久似苏梦涵| 欧美高清中文字幕| 欧美激情在线精品一区二区三区| 国产精品久久久久影院日本| 色操视频在线| 亚洲欧美成人精品| 国产精品欧美亚洲| 午夜精品久久久久久久99樱桃| 成人免费网站黄| 国产一区 二区 三区一级| 色欲色香天天天综合网www| 男男gay无套免费视频欧美| 国产女精品视频网站免费| 懂色av一区| 中文字幕在线国产精品| 黄片毛片在线看| 在线精品视频一区二区三四| 国产1区2区3区4区| 久久久91精品国产一区二区三区| 亚洲精品免费一区亚洲精品免费精品一区 | 日韩在线观看免费网站 | 国产一区二区黄| 性欧美videos另类hd| 日本韩国一区二区| 欧美激情国产精品免费| 日本一区免费视频| www.com日本| 久久国产尿小便嘘嘘| 欧美日韩黄色一级片| 五月天综合网站| 欧美日韩亚洲一区二区三区四区| 日本高清精品| 国产啪精品视频网站| 蜜桃麻豆av在线| 蜜臀久久99精品久久久久久宅男| 日韩资源在线| 欧美mv日韩mv| 99久久久无码国产精品免费| 色婷婷av久久久久久久| 国产手机在线视频| 一区二区三区中文字幕精品精品| 国产18无套直看片| 91美女福利视频| 9.1在线观看免费| 国产一区二区按摩在线观看| 99sesese| 日韩av中文字幕一区二区| 日韩小视频在线播放| 亚洲字幕久久| 亚洲欧洲在线一区| 欧美系列电影免费观看| 久久偷看各类wc女厕嘘嘘偷窃 | 亚洲欧洲激情在线| 欧美 日韩 国产 精品| 欧美一区二区黄| 国产又粗又大又爽| 欧美日韩国产区一| 成人一二三四区| 欧美自拍偷拍一区| 久久久久久亚洲av无码专区| 欧美日韩中文字幕在线视频| 日干夜干天天干| 亚洲国产毛片aaaaa无费看| 亚洲熟女www一区二区三区| 中文字幕五月欧美| 任我爽在线视频| 成人免费一区二区三区视频| 国产精品www爽爽爽| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美a在线观看| 亚洲最大av在线| 亚洲1区在线| 国产91视觉| 国内精品麻豆美女在线播放视频 | 少妇高潮久久久| 精品视频在线导航| 国产视频精品久久| 中文字幕不卡在线视频极品| 日本暖暖在线视频| 久久国产一区二区三区| 在线中文字幕-区二区三区四区| 欧美另类69精品久久久久9999| 男女在线观看视频| 亚洲 日韩 国产第一| 免费在线小视频| 日本欧美精品在线| 国产一区影院| 91aaaa| 美女呻吟一区| 日本不卡久久| 图片区亚洲欧美小说区| 8x8ⅹ国产精品一区二区二区| 精品69视频一区二区三区Q| 欧美变态另类刺激| 日本在线播放一区二区三区| aaa一级黄色片| 成人精品视频一区二区三区| 亚洲做受高潮无遮挡| 欧美经典三级视频一区二区三区| 欧美日韩黄色网| 午夜精品在线视频一区| 久久精品99北条麻妃| 91精品国产高清一区二区三区| 亚洲乱码国产乱码精品精软件| 精品视频在线导航| 久久久久久久久免费视频| 国语自产在线不卡| 中文字幕一区二区人妻电影丶| 妖精视频一区二区三区免费观看 | 中文字幕一区二区三区欧美日韩| 亚洲人成无码网站久久99热国产| 日韩中文字幕区一区有砖一区| 久久久久久久久久毛片| 99视频国产精品| 激情五月深爱五月| 亚洲国产aⅴ天堂久久| 日韩精品在线一区二区三区| 日韩欧美一区电影| 撸视在线观看免费视频| 欧美成人精品影院| 欧美片第一页| 成人羞羞视频免费| 波多野结衣一区| 久久久久免费看黄a片app| 久久国产尿小便嘘嘘| 精品人妻无码一区二区三区| 亚洲免费观看高清完整版在线| 国产成人无码一区二区在线播放| 51精品视频一区二区三区| 欧美套图亚洲一区| 欧美激情精品久久久久| 成人看片毛片免费播放器| 精品免费国产| 狠狠色丁香久久综合频道| 国产精品视频中文字幕| 91啪亚洲精品| 国产精品自拍视频一区| 欧美一三区三区四区免费在线看| 久久经典视频| 69av在线视频| 日韩高清二区| 异国色恋浪漫潭| 美女一区二区三区在线观看| 超碰男人的天堂| 亚洲综合久久av| 国产毛片毛片毛片毛片毛片| 伊人久久精品视频| xxxxxx欧美| 精品视频导航| 亚洲黄页一区| 亚洲少妇一区二区| 成人欧美一区二区三区在线播放| 波多野结衣网站| 亚洲人成电影在线| 亚洲一二三四| 欧美日韩亚洲一区二区三区在线观看| 日韩一级免费| 无码任你躁久久久久久老妇| 亚洲欧美aⅴ...| 国产美女精品视频国产| 日韩亚洲第一页| 青草综合视频| 亚洲一区综合| 捆绑调教一区二区三区| 免费在线观看a视频| 色婷婷激情久久| 国产中文字幕在线视频| 日韩av免费一区| 国产一区三区在线播放| 国产综合免费视频| 久久精品一区四区| 国产精品欧美综合| 中文字幕亚洲欧美| 日韩三区四区| 亚洲国产精品女人| 国产福利一区二区三区视频在线| 国产97免费视频| 日韩午夜激情电影| 国产桃色电影在线播放| 国产亚洲一区在线播放| 中文亚洲免费| 成年人在线免费看片| 欧美日韩高清一区二区不卡| 黄视频网站在线| 成人自拍偷拍| 亚洲少妇自拍| 日韩人妻无码精品综合区| 欧美色视频一区| 超碰在线无需免费| 国外成人免费视频| 久久一区二区三区四区五区| 天天操天天干天天操天天干| 777xxx欧美| 成人免费图片免费观看| 秋霞久久久久久一区二区| 久久国产麻豆精品| 久久免费视频99| 亚洲嫩模很污视频| 在线欧美激情| www.99热这里只有精品| 中文字幕欧美三区| 成人黄色在线观看视频| 26uuu亚洲伊人春色| 日韩精品欧美激情一区二区| 丰满人妻一区二区三区大胸| 精品高清一区二区三区| 69视频在线| 国产精品对白一区二区三区| 天使萌一区二区三区免费观看| 亚洲综合久久av一区二区三区| 亚洲成人av在线播放| 91超碰碰碰碰久久久久久综合| 91看片淫黄大片91| 久久亚洲捆绑美女| 国产ts变态重口人妖hd| 26uuu亚洲国产精品| 888久久久| 国产艳俗歌舞表演hd| 欧美精品乱码久久久久久| 国产盗摄——sm在线视频| 中文字幕一区综合| 337p粉嫩大胆色噜噜噜噜亚洲| 91av久久久| 热久久这里只有| 欧美日韩国产综合网| 大胸美女被爆操|