标题中提到的这两个都是表达式引擎。
据我个人的感觉和理解差不多是同样的东西,但究竟谁好谁差,好在哪差在哪我也不清楚。
不过我都亲测成功了,基本的还是可用的。
这样的库,可以用来实现一些规则非常复杂的功能。
好比公司里有很多的销售,销售每个月要卖出各种课程内容,有的全价售出,有的打了折扣,有的退费了,有的部分退费了,有的顺利开课,有的费了很大成本才完成了一单,有的利润高,有的利润低,有的用了优惠券,有的没有……
最终,每个月要根据多种指标计算销售的业绩。
如:可能同时生效的有这些规则:
总之,因业务而不同,规则可能非常复杂且多变,多种组合,甚至自己需要配置多种表达式。
类似 var monthlyMoney = a + 0.8 * b + 0.65 c + ....... //其中有很复杂的业务和变量
这时候使用表达式引擎就非常合适了。
以下是我自己的一个小demo,亲测有效,是一个简单的maven控制台项目。
上一部分关键代码。
maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.xidea</groupId>
<artifactId>jsel</artifactId>
<version>0.1.0</version>
</dependency>
</dependencies>
代码:
Main方法
package com.codejam.el.console;
import com.codejam.el.console.jexl.JexlTest;
import com.codejam.el.console.jsel.JselTest;
public class ElStarter {
public static void main(String[] args) {
System.out.println("El console start up done.");
//JselTest.Test1();
JexlTest.Test1();
System.out.println("El console start up done.==============");
}
}
Jexl3 库
即依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.1</version>
</dependency>
package com.codejam.el.console.jexl;
import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlContext;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.commons.jexl3.MapContext;
public class JexlTest {
public static void Test1() {
JexlContext jexlContext = new MapContext();
jexlContext.set("var1", 1);
jexlContext.set("var2", 2);
JexlBuilder builder = new JexlBuilder();
JexlExpression expression = builder.create().createExpression("var1 + 2 * var2");
Object evaluate = expression.evaluate(jexlContext);
System.out.println("evaluate " + evaluate.toString());
}
}
Jsel 库
即依赖:
<dependency>
<groupId>org.xidea</groupId>
<artifactId>jsel</artifactId>
<version>0.1.0</version>
</dependency>
package com.codejam.el.console.jsel;
import org.xidea.el.Expression;
import org.xidea.el.impl.ExpressionImpl;
import java.util.HashMap;
public class JselTest {
public static void Test1(){
Expression el = new ExpressionImpl("var1 + 2 * var2");
HashMap context = new HashMap();
context.put("var1",111);
context.put("var2",2);
Object evaluate = el.evaluate(context);
System.out.println("evaluate = " + evaluate.toString());
System.out.println("var1 = " + context.get("var1"));
System.out.println("var2 = " + context.get("var2"));
context.put("var2",3);
System.out.println("var1 = " + context.get("var1"));
System.out.println("var2 = " + context.get("var2"));
System.out.println("evaluate2 = " + el.evaluate(context).toString());
}
}
最后,上demo地址,亲测成功@2021年3月16日00点00分。