Easy Rules终极指南:5个简单步骤掌握Java规则引擎
Easy Rules是一款专为Java开发者设计的轻量级规则引擎,它以"简单、愚蠢"为设计理念,让复杂的业务规则实现变得直观高效。本文将通过5个简单步骤,帮助你快速掌握这个强大工具,轻松处理各种业务规则场景。
一、什么是Easy Rules?为什么选择它? 🤔
在现代Java应用开发中,业务规则往往复杂多变。硬编码这些规则会导致代码难以维护,而传统规则引擎又过于笨重。Easy Rules应运而生,它提供了一种平衡:既比硬编码更灵活,又比重量级规则引擎更轻量。
核心优势包括:
- 极简API:通过注解即可定义规则,无需复杂配置
- 低侵入性:轻松集成到现有项目,无需架构调整
- 丰富特性:支持规则优先级、组合规则、规则监听器等高级功能
- 多种规则定义方式:注解、编程式、JSON/YAML配置文件
二、环境准备:3分钟快速集成 ⚡
2.1 Maven项目集成
在你的pom.xml中添加以下依赖:
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-core</artifactId>
<version>4.1.0</version>
</dependency>
2.2 Gradle项目集成
implementation 'org.jeasy:easy-rules-core:4.1.0'
2.3 源码编译(高级用户)
如果你需要最新特性,可以直接从源码构建:
git clone https://gitcode.com/gh_mirrors/ea/easy-rules
cd easy-rules
mvn clean install
三、5步掌握Easy Rules核心用法 🔥
步骤1:定义规则类
使用@Rule注解标记一个类为规则,通过@Condition和@Action注解分别定义规则的条件和执行动作。
@Rule(name = "Hello World rule", description = "Always say hello world")
public class HelloWorldRule {
@Condition
public boolean when() {
// 条件判断:总是返回true
return true;
}
@Action
public void then() {
// 满足条件时执行的动作
System.out.println("hello world");
}
}
代码来源:easy-rules-tutorials/src/main/java/org/jeasy/rules/tutorials/helloworld/HelloWorldRule.java
步骤2:创建事实(Facts)
事实是规则执行时的上下文数据,使用Facts类存储:
Facts facts = new Facts();
// 添加事实数据
facts.put("userType", "VIP");
facts.put("orderAmount", 1500.0);
步骤3:注册规则
将定义好的规则注册到规则集合中:
Rules rules = new Rules();
rules.register(new HelloWorldRule());
// 可以注册多个规则
rules.register(new DiscountRule());
rules.register(new ShippingRule());
步骤4:配置规则引擎
Easy Rules提供两种规则引擎:
DefaultRulesEngine:按优先级顺序执行规则InferenceRulesEngine:推理引擎,会循环执行规则直到没有可执行规则
// 创建默认规则引擎
RulesEngine rulesEngine = new DefaultRulesEngine();
// 可选:配置引擎参数
RulesEngineParameters parameters = new RulesEngineParameters()
.skipOnFirstAppliedRule(true) // 执行第一个匹配规则后跳过其他规则
.skipOnFirstFailedRule(true) // 规则执行失败后跳过其他规则
.priorityThreshold(10); // 只执行优先级 <= 10的规则
RulesEngine rulesEngine = new DefaultRulesEngine(parameters);
步骤5:执行规则
将规则和事实传递给引擎执行:
rulesEngine.fire(rules, facts);
完整的启动类示例:
public class Launcher {
public static void main(String[] args) {
// 创建事实
Facts facts = new Facts();
// 创建规则
Rules rules = new Rules();
rules.register(new HelloWorldRule());
// 创建规则引擎并执行
RulesEngine rulesEngine = new DefaultRulesEngine();
rulesEngine.fire(rules, facts);
}
}
代码来源:easy-rules-tutorials/src/main/java/org/jeasy/rules/tutorials/helloworld/Launcher.java
四、高级特性与最佳实践 🚀
4.1 规则优先级
通过@Priority注解设置规则执行顺序:
@Rule(name = "High priority rule", priority = 1) // 优先级更高(值越小优先级越高)
public class HighPriorityRule {
// ...
}
4.2 规则组合
使用规则组(Rule Group)组合多个规则:
UnitRuleGroup:组内所有规则都满足才执行ActivationRuleGroup:组内任意规则满足即执行,且只执行第一个ConditionalRuleGroup:根据条件规则决定是否执行其他规则
UnitRuleGroup paymentGroup = new UnitRuleGroup("Payment Rules");
paymentGroup.addRule(new CreditCardRule());
paymentGroup.addRule(new FraudCheckRule());
paymentGroup.addRule(new PaymentProcessingRule());
4.3 从配置文件加载规则
除了注解方式,还可以通过JSON或YAML文件定义规则:
name: "alcohol rule"
description: "children are not allowed to buy alcohol"
priority: 2
condition: "person.age < 18"
actions:
- "System.out.println(\"You are not allowed to buy alcohol\")"
规则文件示例:easy-rules-tutorials/src/main/java/org/jeasy/rules/tutorials/shop/alcohol-rule.yml
然后通过规则工厂加载:
RuleDefinitionReader reader = new YamlRuleDefinitionReader();
Rules rules = reader.read("alcohol-rule.yml");
4.4 规则监听器
通过实现RuleListener接口监听规则执行过程:
public class MyRuleListener implements RuleListener {
@Override
public void beforeEvaluate(Rule rule, Facts facts) {
System.out.println("Before evaluating rule: " + rule.getName());
}
// 其他监听方法...
}
五、实战案例:FizzBuzz游戏实现 🎮
让我们用Easy Rules实现经典的FizzBuzz游戏,展示规则引擎的强大:
// Fizz规则:数字能被3整除
@Rule(priority = 2)
public class FizzRule {
@Condition
public boolean isFizz(@Fact("number") int number) {
return number % 3 == 0;
}
@Action
public void printFizz() {
System.out.print("Fizz");
}
}
// Buzz规则:数字能被5整除
@Rule(priority = 1)
public class BuzzRule {
@Condition
public boolean isBuzz(@Fact("number") int number) {
return number % 5 == 0;
}
@Action
public void printBuzz() {
System.out.print("Buzz");
}
}
// 非FizzBuzz规则:其他情况
@Rule(priority = 3)
public class NonFizzBuzzRule {
@Condition
public boolean isNotFizzOrBuzz(@Fact("number") int number) {
return number % 3 != 0 && number % 5 != 0;
}
@Action
public void printNumber(@Fact("number") int number) {
System.out.print(number);
}
}
代码来源:easy-rules-tutorials/src/main/java/org/jeasy/rules/tutorials/fizzbuzz
六、常见问题与解决方案 ❓
Q1: 如何处理规则之间的依赖关系?
A: 使用ConditionalRuleGroup或规则优先级控制执行顺序,确保依赖规则先执行。
Q2: 规则太多会影响性能吗?
A: Easy Rules设计轻量高效,但大量规则仍可能影响性能。建议:
- 使用规则优先级过滤非必要规则
- 对相似规则进行分组
- 考虑使用规则缓存
Q3: 能否动态修改规则?
A: 可以通过规则引擎的update方法动态更新规则,或从配置文件重新加载规则。
七、总结与资源推荐 📚
通过本文介绍的5个步骤,你已经掌握了Easy Rules的核心用法。这个强大而简洁的规则引擎可以帮助你优雅地处理各种复杂业务规则,让代码更清晰、更易维护。
官方核心模块:
- easy-rules-core:核心实现
- easy-rules-support:规则定义读取器和组合规则支持
- easy-rules-tutorials:丰富的示例代码
无论你是需要处理电商折扣规则、风控策略还是工作流逻辑,Easy Rules都能成为你的得力助手。现在就开始尝试,体验规则引擎带来的开发效率提升吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



