官网源码:https://github.com/j-easy/easy-rules
官网案例:https://github.com/j-easy/easy-rules/wiki/fizz-buzz
介绍:
规则引擎是为了解决业务代码和业务规则分离的引擎,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离,其实就是将一大堆if/else进行处理,Easy Rules 所做的,它提供了Rule创建具有条件和操作的规则的抽象,以及RulesEngine通过一组规则运行以评估条件和执行操作的API
核心功能:
- 轻量级库和易于学习的 API
- 带有注解编程模型的基于 POJO 的开发
- 用于定义业务规则并通过 Java 轻松应用它们的有用抽象
- 从原始规则创建复合规则的能力
- 使用表达式语言(如 MVEL、SpEL 和 JEXL)定义规则的能力
一个规则由名称、描述、优先级三个属性和判断、执行两个方法组成,实现Rule接口,
和使用@Rule,@Condition,@Action,@Priority,@Fact注解的效果是一样的。
它主要包括几个主要的类或接口:Rule,RulesEngine,RuleListener,Facts
还有几个主要的注解:@Action,@Condition,@Fact,@Priority,@Rule
- Rule
public interface Rule extends Comparable<Rule> {
/**
* 默认的规则名称
*/
String DEFAULT_NAME = "rule";
/**
* 默认的规则描述
*/
String DEFAULT_DESCRIPTION = "description";
/**
* 默认的规则优先级
*/
int DEFAULT_PRIORITY = Integer.MAX_VALUE - 1;
getter and setter...
/**
* 规则引擎判断条件
* 如果提供的facts被应用到规则上返回true,否则返回false
*/
boolean evaluate(Facts facts);
/**
* 规则引擎判断条件返回true后,执行此方法
*/
void execute(Facts facts) throws Exception;
}
- RulesEngine负责检查和开启规则,同时可以得到规则引擎的参数和规则监听器列表
public interface RulesEngine {
/**
* 返回规则引擎的参数
*/
RulesEngineParameters getParameters();
/**
* 返回已注册的规则监听器的列表
*/
List<RuleListener> getRuleListeners();
/**
* 在给定的因素上开启所有已注册的规则
*/
void fire(Rules rules, Facts facts);
/**
* 检查规则和因素是否符合
*/
Map<Rule, Boolean> check(Rules rules, Facts facts);
}
- RuleListener在规则执行的4个阶段加上了触发器,可以灵活地控制规则执行结果
(定义规则监听器通过实现RuleListener接口)
public interface RuleListener {
/**
* 规则条件判断之前的触发器
*/
boolean beforeEvaluate(Rule rule, Facts facts);
/**
* 规则条件判断之后的触发器
*/
void afterEvaluate(Rule rule, Facts facts, boolean evaluationResult);
/**
* 规则执行之前的触发器
*/
void beforeExecute(Rule rule, Facts facts);
/**
* 规则执行成功之后的触发器
*/
void onSuccess(Rule rule, Facts facts);
/**
* 规则执行失败之后的触发器
*/
void onFailure(Rule rule, Facts facts, Exception exception);
}
- Facts就是一个hashmap,通过注解@Fact(String value),其中的value是map的key,可以拿到Facts中的value
public class Facts implements Iterable<Map.Entry<String, Object>> {
private Map<String, Object> facts = new HashMap<>();
/**
* 在工作空间放置一个因素
*/
public Object put(String name, Object fact) {
Objects.requireNonNull(name);
return facts.put(name, fact);
}
/**
* 删除因素
*/
public Object remove(String name) {
Objects.requireNonNull(name);
return facts.remove(name);
}
/**
* 通过name得到因素
*/
public Object get(String name) {
Objects.requireNonNull(name);
return facts.get(name);
}
/**
* 以map形式返回因素
*/
public Map<String, Object> asMap() {
return facts;
}
...
}
一. pom.xml中引入maven依赖
<!--easy rules核心库-->
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-

最低0.47元/天 解锁文章
2705

被折叠的 条评论
为什么被折叠?



