开发者

springboot 整合表达式计算引擎 Aviator 使用示例详解

目录
  • 一、前言
  • 二、表达式计算框架概述
    • 2.1 规则引擎
      • 2.1.1 什么是规则引擎
      • 2.1.2 规则引擎用途
      • 2.1.3 规则引擎使用场景
    • 2.2 表达式计算框架
      • 2.2.1 表达式计算框架定义
      • 2.2.2 表达式计算框架特点
      • 2.2.3 表达式计算框架应用场景
    • 2.3 表达式计算框架与规则引擎异同点
      • 2.3.1 相同点
      • 2.3.2 不同点
  • 三、表达式计算框架 Google Aviator介绍
    • 3.1 Google Aviator概述
      • 3.1.1 Aviator是什么
      • 3.1.2 Aviator特点
    • 3.2 Google Aviator 优势和应用场景
    • 四、Google Aviator使用
      • 4.1 Aviator常用运算符操作
        • 4.1.1 入门示例
        • 4.1.2 算术运算符
        • 4.1.3 比较运算符
        • 4.1.4 逻辑操作符
        • 4.1.5 运算符操作补充
      • 4.2 Aviator内置函数使用
        • 4.2.1 随机数函数
        • 4.2.2 数值比较函数
        • 4.2.3 强制类型转换
        • 4.2.4 数值类型判断
        • 4.2.5 常用的字符串函数
        • 4.2.6 常用数学函数
        • 4.2.7 集合操作函数
      • 4.3 Aviator自定义函数使用
        • 4.3.1 在外部文件中定义函数
        • 4.3.2 继承AbstractFunction
    • 五、springboot项目集成Aviator
      • 5.1 使用场景
        • 5.1.1 自定义规则表达式
        • 5.1.2 提前定义计算表达式
      • 5.2 整合使用过程
        • 5.2.1 自定义Aviator工具类
        • 5.2.2 添加测试接口
        • 5.2.3 效果测试
    • 六、写在文末

      一、前言

      在项目开发中,通常会遇到诸如各类表达式计算的需求,比如根据页面输入的某种条件参数,服务端计算得到一种结果,在输入另一种条件参数,服务端计算得到另一种结果,对于简单的条件来说,服务端可以通过简单的条件判断并解析参数,组装计算表达式即可完成,但设想以后类似的场景越来越多,也越来越复杂时,这必然会造成代码的臃肿和维护成本的不断提高,于是,表达式计算求值框架就出现了。

      二、表达式计算框架概述

      在正式介绍表达式计算框架之前,需要搞懂与规则引擎的异同点,否则在实际场景中进行选择时很容易混淆,虽然两者之间存在一些异同点。

      2.1 规则引擎

      2.1.1 什么是规则引擎

      规则引擎(Rule Engine)是一种软件组件或系统,它允许用户通过定义规则来控制业务逻辑或应用程序的行为。这些规则通常是基于业务策略或决策逻辑的声明性语句,用于指导软件如何响应不同的情况或事件。

      规则引擎通过自动化决tXGltK策过程,帮助开发者将复杂的业务逻辑从应用程序代码中分离出来,从而提高了应用程序的灵活性、可维护性和可扩展性。

      2.1.2 规则引擎用途

      规则引擎可被定义为一种软件架构或技术,它提供一种机制来定义、部署、执行和管理业务规则。通过将这些规则从应用程序代码中分离出来,并使用专门的规则引擎来管理和执行它们,开发者可以更容易地实现和维护复杂的业务逻辑,同时保持应用程序的灵活性和可扩展性。它具备如下用途:

      • 业务决策自动化:自动化复杂的业务决策过程,减少人工干预和错误。
      • 提高灵活性:允许在不修改应用程序代码的情况下更改业务规则。
      • 优化应用性能:通过高效的规则匹配和执行算法,提高应用程序的响应速度和吞吐量。
      • 简化代码的维护:将业务逻辑与应用程序代码分离,降低维护成本和复杂度。

      2.1.3 规则引擎使用场景

      规则引擎作为一种能够自动执行预设逻辑的软件工具,使用场景非常广泛,涵盖多个行业和领域。以下列举了规则引擎的一些主要使用场景:

      • 业务流程自动化编程客栈
        • 订单审批:自动评估订单是否符合规则,避免手动检查带来的延迟和错误。
        • 贷款预审:根据借款人的信息和信用记录,自动判断是否批准贷款申请。
      • 风险管理
        • 欺诈检测:实时监控交易活动,识别可疑行为并触发警报。
        • 反洗钱:筛选交易,发现潜在的洗钱活动,并向相关当局报告。
      • 网络安全
        • 威胁检测和响应:自动检测并响应安全威胁,例如入侵和数据泄露。
      • 操作优化
        • 库存管理:根据需求、成本和库存水平自动触发补货订单。
        • 供应链规划:根据订单模式和供应商性能自动优化供应链流程。
        • 生产调度:根据产能和订单优先级自动安排生产计划。
      • 指导营销与销售
        • 推荐引擎:根据用户历史和偏好,为用户推荐相关产品或服务。
        • 个性化营销:创建个性化的营销活动,针对特定客户群。
      • 其他行业应用
        • 金融行业:用于金融机构的反欺诈、风险评估、交易监控等场景,在金融风险管控和管理中发挥重要作用。
        • 电子商务:应用于电商平台的个性化推荐、营销策略、订单分配等方面,提高运营效率和用户体验。
        • 物流领域:应用于物流配送中的运输路径规划、优先级分配、异常处理等场景,使物流运营更加高效和准确。
        • 制造业:应用于制造业中的产品配置、交互品质控制、工艺优化等方面,提高生产效率和产品质量。
        • 健康医疗:应用于临床决策支持系统、医疗保险资格认证、病例诊断等领域,帮助医生和医疗专业人员做出更准确和及时的决策。
        • 物联网:用于物联网平台,通过对传感器数据和设备状态的实时监测,自动化地执行管理策略、触发报警和调度任务等。
        • 政府和公共服务:用于许可证审批、社会救助资格审核、税收计算等方面。

      2.2 表达式计算框架

      2.2.1 表达式计算框架定义

      表达式计算框架(Expression EvaLuation Framework)是一个用于解析、计算和处理表达式的软件架构或系统。它允许用户输入包含变量、运算符和可能的其他元素(如函数、括号等)的表达式,并自动计算其结果。

      表达式计算框架在多个领域都有广泛应用,包括但不限于编程语言、数据库查询、业务规则引擎、科学计算等。

      2.2.2 表达式计算框架特点

      表达式计算框架具备如下特点:

      • 解析能力
        • 表达式计算框架能够解析复杂的表达式,包括中缀表达式、后缀表达式(逆波兰表示法,RPN)等,理解其结构和含义。
      • 通用的计算能力
        • 通过内置的算法和逻辑,框架能够自动计算表达式的值,并返回结果。这通常涉及到运算符的优先级处理、括号内的子表达式计算等。
      • 可扩展性
        • 为了支持不同领域和场景的需求,表达式计算框架通常具有良好的可扩展性。用户可以自定义运算符、函数、变量等,以适应特定的业务逻辑或计算需求。
      • 性能优化
        • 为了提高计算效率,表达式计算框架可能会采用各种优化技术,如缓存机制、并行计算等
      • 错误处理
        • 在解析和计算过程中,框架能够识别和处理各种错误情况,如语法错误、类型不匹配、除零错误等,并提供相应的错误信息和处理建议。

      2.2.3 表达式计算框架应用场景

      表达式计算框架的应用场景非常广泛,涵盖了从基础编程到复杂业务逻辑的多个方面。以下是几个主要的应用场景:

      • 编程领域,编译器与解释器
        • 在编译型或解释型编程语言的实现中,表达式计算框架是核心组件之一。它负责解析用户编写的表达式,并按照语言的语法和语义规则计算其结果。无论是简单的算术表达式还是复杂的逻辑表达式,表达式计算框架都能提供准确且高效的计算服务。
      • 数据库查询与数据处理
        • SQL查询:在数据库管理系统中,SQL查询语句经常包含各种表达式,用于计算字段值、筛选数据或生成新的计算结果。表达式计算框架能够解析这些表达式,并利用数据库中的数据进行计算,从而支持复杂的查询操作。
        • 数据处理与分析:在数据分析和数据挖掘领域,表达式计算框架被用于执行各种统计和数学计算,以提取数据中的有用信息。这些计算可能包括求和、平均值、标准差、方差等统计量,也可能包括更复杂的数学函数和算法。
      • 业务规则引擎
        • 决策支持:在业务规则引擎中,表达式计算框架用于根据预定义的规则计算表达式的值,以支持复杂的业务决策过程。这些规则可能涉及客户资格、贷款审批、保险理赔等多个方面,而表达式计算框架则提供了灵活且强大的计算能力来支持这些决策。
        • 流程控制:在某些业务流程中,表达式的计算结果可能用于控制流程的走向。例如,在一个订单处理系统中,订单的优先级可能由多个因素共同决定,而这些因素可以通过表达式计算框架进行计算和比较。
      • 科学计算与工程应用
        • 数学与物理模拟:在科学计算和工程应用中,表达式计算框架被用于执行各种数学和物理公式的计算。这些计算可能涉及微积分、线性代数、矩阵运算等多个领域,而表达式计算框架则提供了精确且高效的计算能力来支持这些复杂的计算任务。
        • 仿真与建模:在仿真和建模领域,表达式计算框架被用于模拟真实世界中的物理现象或系统行为。通过计算表达式来模拟系统的动态变化,可以帮助研究人员更好地理解和预测系统的行为特性。
      • 软件开发与自动化测试
        • 单元测试与集成测试:在软件开发过程中,表达式计算框架可以用于编写单元测试和集成测试。通过计算表达式来验证代码的正确性和可靠性,可以帮助开发人员及时发现和修复潜在的问题。
        • 自动化脚本编写:在自动化测试和部署过程中,表达式计算框架可以用于编写自动化脚本。这些脚本可能包含各种计算任务,如计算性能指标、验证数据一致性等。通过利用表达式计算框架的计算能力,可以大大提高自动化脚本的编写效率和准确性。

      2.3 表达式计算框架与规则引擎异同点

      规则引擎和表达式计算框架在功能上有一些重叠,但在用途和设计目的上有明显的区别。下面对其异同点做一些总结:

      2.3.1 相同点

      • 表达式处理
        • 两者都可以处理和计算表达式,无论是简单的数学运算还是复杂的逻辑表达式。
      • 灵活性
        • 它们都旨在提高程序的灵活性,使得在不修改代码的情况下调整逻辑变得更加容易。
      • 可扩展性
        • 两者都支持一定程度上的可扩展性,例如添加新的函数或操作符。

      2.3.2 不同点

      两者在进行技术选择上更多出于各自的应用场景的差异

      • 核心功能
        • 规则引擎:主要关注业务规则的管理和执行,能够处理复杂的业务逻辑,如条件判断、决策制定等。
        • 表达式计算框架:主要关注表达式的解析和计算,通常不涉及复杂的业务逻辑。
      • 使用场景
        • 规则引擎:适用于需要频繁改变业务逻辑的应用,如订单处理、客户信用评分等。
        • 表达式计算框架:适用于需要计算数学或逻辑表达式的场合,如财务计算、数据分析等。
      • 使用复杂性
        • 规则引擎:通常具有更复杂的配置和管理功能,支持更复杂的规则定义和执行。
        • 表达式计算框架:相对简单,专注于表达式的解析和计算。
      • 对规则的定义
        • 规则引擎:规则通常以特定的语法或格式定义,如 DRL(Drools Rule Language)、Excel 决策表等。
        • 表达式计算框架:表达式通常以更通用的形式定义,如数学公式或逻辑表达式。
      • 执行模型
        • 规则引擎:通常支持多种执行模型,如正向链推理、反向链推理等。
        • 表达式计算框架:主要关注单个表达式的计算,没有复杂的执行模型。
      • 集成度
        • 规则引擎:往往需要更多的配置和集成工作,以便与应用程序的其他部分协调工作。
        • 表达式计算框架:通常更容易集成,只需简单的配置即可开始使用。

      三、表达式计算框架 Google Aviator介绍

      3.1 Google Aviator概述

      3.1.1 Aviator是什么

      Google Aviator 是一个高性能、轻量级的 Java 表达式求值引擎,它的设计目的是为了提供快速的表达式计算能力,Aviator 主要用于动态计算表达式,尤其是在需要频繁计算的场景中表现出色。

      3.1.2 Aviator特点

      Google Aviator具备如下特点:

      • 轻量级:Aviator 的体积非常小,所有依赖包加起来也只有大约 450KB 大小,如果不包含外部依赖,则只有约 70KB。与某些重量级的脚本语言(如Groovy)相比,Aviator非常紧凑,因此适用于对性能要求较高的应用程序。
      • 高性能:Aviator 通过直接将表达式编译成 Java 字节码并由 JVM 执行来实现高性能。
      • 易于集成:Aviator 提供了简单的 API,可以轻松地集成到 Java 应用程序中。
      • 支持自定义函数:用户可以定义自己的函数并将其嵌入到 Aviator 的环境中,这使得 Aviator 可以应对更为复杂的业务场景。
      • 语法简单:Aviator 的语法相对简单,易于理解和使用。
      • 支持多种运算符:Av编程iator 支持算术运算符、关系运算符、逻辑运算符、位运算符、正则匹配运算符(=~)、三元表达式等,并且支持操android作符的优先级和括号强制优先级。

      3.2 Google Aviator 优势和应用场景

      Google Aviator 作为一种高性能、轻量级的 Java 表达式求值引擎,非常适合在需要动态计算表达式的场景中使用,下面总结了一些 Aviator 的典型使用场景:

      • 动态配置解析
        • 在某些系统中,可能需要根据不同的环境或用户输入动态调整配置参数。Aviator 可以用来解析这些配置中的表达式,并根据实际的参数值计算出结果。
      • 报表计算与分析
        • 在报表系统中,经常需要计算各种复杂的统计指标,比如平均值、标准差等。Aviator 可以用来定义和计算这些统计表达式。
      • 复杂业务逻辑处理
        • 当业务逻辑需要根据一定的条件计算出结果时,Aviator 可以用来简化这部分代码,不需要再使用复杂的逻辑进行各种参数的解析,让逻辑更加清晰和易于维护。
      • 性能敏感的应用
        • 对于一些性能要求极高的应用,Aviator 通过直接编译表达式为 Java 字节码的方式,可以显著提高表达式计算的速度。
      • 作为规则引擎使用
        • 在需要定义业务规则的场景下,Aviator 可以作为一个轻量级的规则引擎来使用,尤其是在规则需要频繁变更的情况下。
      • 游戏开发
        • 游戏中常常需要根据玩家的行为计算得分或者奖励,Aviator 可以用来快速评估这些动态变化的计算规则。
      • 数据验证
        • 在数据处理流程中,Aviator 可以用来定义数据校验规则,确保数据的有效性和一致性。
      • 工作流和自动化脚本
        • 在工作流管理系统或自动化脚本中,可以通过 Aviator 动态地计算任务之间的依赖关系或条件。
      • 监控与告警
        • 监控系统中往往需要根据监控数据实时计算阈值,Aviator 可以用来快速计算这些阈值并触发相应的告警。
      • 财务和金融应用
        • 在财务和金融领域,有javascript许多复杂的计算公式需要执行,Aviator 可以用来简化这些公式的实现。
      • 测试和模拟环境
        • 在测试或模拟环境中,可能需要使用 Aviator 来模拟某些行为或计算预期的结果。
      • 自定义函数扩展
        • Aviator 支持自定义函数,可以针对特定领域的复杂计算需求进行扩展。
      • 策略决策
        • 在策略决策系统中,可以使用 Aviator 快速评估不同策略的效果,帮助做出最佳决策。

      Aviator 的主要优势在于它能够提供快速、灵活的表达式计算能力,因此在任何需要频繁计算表达式的场景中都可以发挥重要作用。

      四、Google Aviator使用

      接下来通过代码的操作演示Aviator如何使用,前置准备,以springboot项目为例,在你的工程中引入如下依赖

              <dependency>
                  <groupId>com.googlecode.aviator</groupId>
                  <artifactId>aviator</artifactId>
                  <version>5.3.3</version>
              </dependency>

      4.1 Aviator常用运算符操作

      4.1.1 入门示例

      在工程的某个包目录下创建一个hello.av的文件,在该文件中编写计算规则的表达式,然后再在代码中进行调用,这也是使用Aviator的一个基本的思路,如下

      springboot 整合表达式计算引擎 Aviator 使用示例详解

      在hello.av中添加如下内容

      println("hello aviator");

      HelloWord代码如下:

      import com.googlecode.aviator.AviatorEvaluator;
      import com.googlecode.aviator.Expression;
       
      public class HelloWord {
       
          public static void main(String[] args) throws Exception{
              String helloPath = "E:\\code-self\\117\\sa-token\\src\\main\\java\\com\\congge\\aviator\\hello.av";
              Expression expression = AviatorEvaluator.getInstance().compileScript(helloPath);
              expression.execute();
          }
       
      }

      运行之后效果如下,即可将hello.av中的内容进行输出

      springboot 整合表达式计算引擎 Aviator 使用示例详解

      如果表达式比较简单,也可以直接在代码中进行定义,如下:

      public static void main(String[] args) throws Exception{
              String helloPath = "E:\\code-self\\117\\sa-token\\src\\main\\java\\com\\congge\\aviator\\hello.av";
              Expression expression = AviatorEvaluator.getInstance().compileScript(helloPath);
              expression.execute();
              String expr2 = "println(\"hello aviator\");";
              Expression expression2 = AviatorEvaluator.getInstance().compile(expr2);
              expression2.execute();
          }

      4.1.2 算术运算符

      作为一门表达式计算框架,aviator支持常用的 加减乘除的计算,参考下面的示例

      public static void main(String[] args) {
              compute("println(1+3)");
              compute("p(1+3)");
              compute("p(5-3)");
              compute("p(5*3)");
              compute("p(9/3)");
              compute("p((3 + 2) * 5)");
          }
          public static void compute(String expr){
              Expression compile = AviatorEvaluator.compile(expr);
              compile.execute();
          }

      运行得到计算结果

      springboot 整合表达式计算引擎 Aviator 使用示例详解

      4.1.3 比较运算符

      aviator提供了比较运算符用于数据比较的场景,参考下面的示例

          public static void main(String[] args) {
              //比较运算符
              compute("p(3==3)");
              compute("p(3!=2)");
              compute("p(3<2)");
          }
          public static void compute(String expr){
              Expression compile = AviatorEvaluator.compile(expr);
              compile.execute();
          }

      4.1.4 逻辑操作符

          public static void main(String[] args) {
              //逻辑操作运算符
              compute("p( 3!=2 && 3<2)");
              compute("p( !(3>2))");
          }
          public static void compute(String expr){
              Expression compile = AviatorEvaluator.compile(expr);
              compile.execute();
          }

      4.1.5 运算符操作补充

      如果代码中涉及的运算符计算比较多,也可以写在.av文件中,然后程序中调用,格式符合aviator的规范即可,如下示例

      let a = 10;
      let b = 11;
      if a > b {
        p("#{a} > #{b}");
      }elsif a < b {
        p("#{a} < #{b}");
      }else {
          p("#{a} = #{b}");
      }

      然后再在程序中进行调用

      public static void main(String[] args) throws Exception{
              Expression expression = AviatorEvaluator.getInstance().compileScript("E:\\code-self\\117\\sa-token\\src\\main\\java\\com\\congge\\aviator\\condition.av");
              expression.execute();
          }

      springboot 整合表达式计算引擎 Aviator 使用示例详解

      4.2 Aviator内置函数使用

      像很多技术框架一样都会提供一些内置的函数,可供开发者开箱即用,Aviator也提供了一些常用的内置函数,下面通过代码示例来感受下。

      4.2.1 随机数函数

      rand()函数可以生成一个随机数

      compute("p(rand(10))");

      4.2.2 数值比较函数

      函数格式:cmp(number1,number2)

      • a>b,结果1;
      • a=b,结果0;
      • a<b,结果-1;
      compute("p(cmp(5,9))");
      compute("p(cmp(10,9))");
      compute("p(cmp(9,9))");

      4.2.3 强制类型转换

      函数格式:cmp(number1,number2)

      //数据类型强制转换  字符串转为 long
      compute("p(long('1'))");

      4.2.4 数值类型判断

      判断某个值是否某个类型,函数:is_a()

      //is_a , 判断某个值是否某个类型的实例
      compute("p(is_a('hello',String))");
      compute("p(is_a(5,Long))");
      compute("p(is_a(1.3,Double))");

      4.2.5 常用的字符串函数

      字符串函数在开发中是一种高频使用的函数,下面列举几种

      //字符串是否包含
      compute("p(string.contains('hello aviator','aviator'))");
      //字符串长度
      compute("p(string.length('hello aviator'))");
      //字符串截取
      compute("p(string.substring('hello aviator',4,9))");
      //字符串位置
      compute("p(string.indexOf('hello aviator','hello'))");

      4.2.6 常用数学函数

      //最大值,从一组数值中找到最大的
      compute("p(max(1,12,8,1.2,23,18))");
      //绝对值
      compute("p(math.abs(-1))");
      //四舍五入
      compute("p(math.round(3.3))");

      4.2.7 集合操作函数

      数组:

      //创建指定类型的数组
      compute("p(seq.array(long,1,2,3,4,5))");

      arraylist:

      //创建一个arraylist
      compute("p(seq.list(1,2,3,4,5))");

      arraylist使用脚本操作:

      let a = seq.list(1,2,3,4,5);
      seq.add(a,15);
      p(a);

      set操作

      compute("p(seq.set(1,2,3,5))");

      map操作

      compute("p(seq.map('k1','v1','k2','v2'))");

      4.3 Aviator自定义函数使用

      在某些相对复杂的场景下,内置函数搞不定的时候,自定义函数就派上用场了,在实际使用自定义函数时,主要有两种方式,在.av文件中自定义函数,或者在class类中通过编码方式定义函数;

      4.3.1 在外部文件中定义函数

      如下,在func.av文件中定义如下函数

      fn add(a,b){
          return a+b;
      }
      res = add(11,12);
      println("add res = #{res}")

      再在程序中调用该函数

      Expression addExpr = AviatorEvaluator.getInstance().compileScript("E:\\code-self\\117\\sa-token\\src\\main\\java\\com\\congge\\aviator\\func.av");
      addExpr.execute();

      执行结果

      springboot 整合表达式计算引擎 Aviator 使用示例详解

      4.3.2 继承AbstractFunction

      也可以通过继承AbstractFunction抽象类,并重写里面的相关方法完成自定义函数,如下两个自定义方法中,继承了AbstractFunction类之后,里面有很多待重写的方法可供使用,选择一个符合自己需求的方法即可:

      • getName():为你的自定义函数命名,然后再在方法注册的时候使用该名称;
      • call():实际编写处理计算逻辑的核心方法;
      import com.googlecode.aviator.AviatorEvaluator;
      import com.googlecode.aviator.runtime.function.AbstractFunction;
      import com.googlecode.aviator.runtime.function.FunctionUtils;
      import com.googlecode.aviator.runtime.type.AviatorDouble;
      import com.googlecode.aviator.runtime.type.AviatorLong;
      import com.googlecode.aviator.runtime.type.AviatorObject;
      import java.util.Collection;
      import java.util.Map;
      public class OwnFunction {
          public static void main(String[] args) {
              AviatorEvaluator.addFunction(new AddFunc());
              Object executeRes = AviatorEvaluator.execute("addMethod(11,12)");
              System.out.println(executeRes);
              AviatorEvaluator.addFunction(new SumFunc());
              Object executeResSum = AviatorEvaluator.execute("sumMethod(seq.list(1,2,3,4,5))");
              System.out.println(executeResSum);
          }
      }
      class AddFunc extends AbstractFunction {
          @Override
          public String getName() {
              return "addMethod";
          }
          @Override
          public AviatorObject call(Map<String, Object> env, AviatorObject arg1,AviatorObject arg2) {
              Number num1 = FunctionUtils.getNumberValue(arg1, env);
              Number num2 = FunctionUtils.getNumberValue(arg2, env);
              return new AviatorDouble(num1.doubleValue() + num2.doubleValue());
          }
      }
      class SumFunc extends AbstractFunction {
          @Override
          public String getName() {
              return "sumMethod";
          }
          @Override
          public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
             Collection<Object> collection = (Collection<Object>)arg1.getValue(env);
             long sum = 0;
             for(Object item :collection ){
                 sum += (long)item;
             }
             return AviatorLong.valueOf(sum);
          }
      }

      方法1:实现两个数相加

      方法2:实现一个列表中的元素累加求和

      springboot 整合表达式计算引擎 Aviator 使用示例详解

      五、springboot项目集成Aviator

      5.1 使用场景

      在正式开始之前,如果在你的springboot项目集成并使用Aviator,可以按照需求先提取几种常用的场景。

      5.1.1 自定义规则表达式

      核心思路和步骤分为下面几步:

      • 用户输入自定义表达式,和相关的参数
        • 这个操作可以通过界面交互的方式完成;
        • 自定义的表达式和参数最后通过接口存储数据库;
      • 在某个业务功能对应的交换页面,涉及到需要进行规则计算的位置选择上述自定义表达式
        • 此处是为了建立具体的业务与表达式的关联;
      • 触发计算
        • 在业务需要计算的时候触发自定义表达式的计算

      这类场景在一些涉及到交换的场景,或者一些数据中台的场景中多有运用

      5.1.2 提前定义计算表达式

      这种方式即提前根据需求编制一些计算表达式,并集中存储到数据库或配置文件中,在需要使用的时候,通过传入计算要用到的参数,调用提前配置的表达式进行计算,要求业务一般不会发生太大的变动下可以考虑使用。

      5.2 整合使用过程

      下面介绍完整的整合步骤

      5.2.1 自定义Aviator工具类

      为了便于在需要计算表达式值得逻辑中使用,建议自定义一个工具类方便调用,工具类中还可以自定义的方法等

      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class AviatorUtils {
          private String expression;
          /**
           * 根据入参和表达式计算结果
           * @param env
           * @return
           */
          public Object execute(Map<String, Object> env) {
              //添加自定义函数
              //AviatorEvaluator.addFunction(new AddFunc());
              Object execute = AviatorEvaluator.execute(expression, env);
              return execute;
          }
      }

      5.2.2 添加测试接口

      为方便测试效果,添加一个测试接口

      import com.congge.config.AviatorUtils;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.bind.annotation.RestController;
      import java.util.HashMap;
      import java.util.Map;
      @RestController
      public class AviatorController {
          //localhost:8081/compute?expression=(x+y) * 3
          @GetMapping("/compute")
          public Object compute(@RequestParam String expression){
              Map<String, Object> env = new HashMap<>();
              env.put("x", 10);
              env.put("y", 20);
              AviatorUtils aviatorUtils = new AviatorUtils(expression);
              Object executeRes = aviatorUtils.execute(env);
              return executeRes;
          }
      }

      5.2.3 效果测试

      调用上述的接口:http://localhost:8081/compute?expression=x*y

      springboot 整合表达式计算引擎 Aviator 使用示例详解

      六、写在文末

      本文通过较大的篇幅详细介绍了Google Aviator 这款高性能、轻量级的 Java 表达式求值引擎,并通过详细的代码操作演示了相关API的使用以及如何在springboot项目中进行集成,希望对看到的同学有用,本篇到此结束,感谢观看。

      到此这篇关于springboot 整合表达式计算引擎 Aviator 使用详解的文章就介绍到这了,更多相关springboot 表达式计算引擎 Aviator内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜