java 动态 正则表达式_Java中动态规则的实现方式

本文探讨了Java环境下处理动态规则的几种方法,包括表达式语言(如JUEL、MVEL、OGNL和SpEL)、规则引擎(如Drools)以及动态JVM语言(如Groovy)。通过实例展示了如何使用这些工具进行动态正则表达式和业务逻辑的实现,强调了它们在性能、灵活性和集成性方面的特点。
摘要由CSDN通过智能技术生成

背景

业务系统在应用过程中,有时候要处理“经常变化”的部分,这部分需求可能是“业务规则”,也可能是“不同的数据处理逻辑”,这部分动态规则的问题,往往需要可配置,并对性能和实时性有一定要求。

Java不是解决动态层问题的理想语言,在实践中发现主要有以下几种方式可以实现:

表达式语言(expression language)

动态语言(dynamic/script language language),如Groovy

规则引擎(rule engine)

表达式语言

Java Unified Expression Language,简称JUEL,是一种特殊用途的编程语言,主要在Java Web应用程序用于将表达式嵌入到web页面。Java规范制定者和Java Web领域技术专家小组制定了统一的表达式语言。JUEL最初包含在JSP 2.1规范JSR-245中,后来成为Java EE 7的一部分,改在JSR-341中定义。

这里主要介绍在实践中使用较多的MVEL、OGNL和SpEL。

OGNL(Object Graph Navigation Library)

在Struts 2 的标签库中都是使用OGNL表达式访问ApplicationContext中的对象数据,简单示例:

Foo foo = newFoo();

foo.setName("test");

Map context = new HashMap();

context.put("foo",foo);

String expression = "foo.name == 'test'";

try{

Boolean result =(Boolean) Ognl.getValue(expression,context);

System.out.println(result);

} catch(OgnlException e) {

e.printStackTrace();

}

MVEL

MVEL最初作为Mike Brock创建的 Valhalla项目的表达式计算器(expression evaluator),相比最初的OGNL、JEXL和JUEL等项目,而它具有远超它们的性能、功能和易用性 - 特别是集成方面。它不会尝试另一种JVM语言,而是着重解决嵌入式脚本的问题。

MVEL主要使用在Drools,是Drools规则引擎不可分割的一部分。

MVEL语法较为丰富,不仅包含了基本的属性表达式,布尔表达式,变量复制和方法调用,还支持函数定义,详情参见MVEL Language Guide 。

MVEL在执行语言时主要有解释模式(Interpreted Mode)和编译模式(Compiled Mode )两种:

解释模式(Interpreted Mode)是一个无状态的,动态解释执行,不需要负载表达式就可以执行相应的脚本。

编译模式(Compiled Mode)需要在缓存中产生一个完全规范化表达式之后再执行。

//解释模式

Foo foo = newFoo();

foo.setName("test");

Map context = newHashMap();

String expression = "foo.name == 'test'";

VariableResolverFactory functionFactory = newMapVariableResolverFactory(context);

context.put("foo",foo);

Boolean result =(Boolean) MVEL.eval(expression,functionFactory);

System.out.println(result);

//编译模式

Foo foo = new Foo();foo.setName("test");

Map context = newHashMap();

String expression = "foo.name == 'test'";

VariableResolverFactory functionFactory = new MapVariableResolverFactory(context);context.put("foo",foo);

Serializable compileExpression =MVEL.compileExpression(expression);

Boolean result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值