Spring Boot整合Drools入门:实现订单积分规则
文章目录
- 项目结构
- Maven配置
- 配置Drools
- 订单实体类
- 订单积分规则
- 测试规则
- 总结
在开发过程中,我们经常遇到需要根据业务规则来进行决策的场景。比如,电商平台可能需要根据订单金额为用户添加相应的积分。为了灵活地处理这些业务规则,我们可以借助Drools这样的规则引擎。而本文将分享如何使用Spring Boot整合Drools,实现一个简单的订单积分规则。
项目结构
在项目中,我们创建了以下几个主要部分:
- Drools配置类:用于加载和配置Drools规则。
- Order实体类:代表订单对象,包含订单金额和积分字段。
- Drools规则文件:定义积分计算的具体规则。
- 测试类:用于验证Drools规则的正确性。
Maven配置
在pom.xml
中,我们添加了必要的依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
这些依赖为我们提供了Spring Boot的核心功能、Drools规则引擎以及Lombok工具,极大地方便了开发。
配置Drools
Drools配置类负责加载规则文件并提供KieContainer
,用于管理Drools会话。
@Configuration
public class DroolsConfig {private static final KieServices kieServices = KieServices.Factory.get();private static final String RULES_CUSTOMER_RULES_DRL = "rules/order.drl";@Beanpublic KieContainer kieContainer() {KieFileSystem kieFileSystem = kieServices.newKieFileSystem();kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_CUSTOMER_RULES_DRL));KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);kieBuilder.buildAll();KieModule kieModule = kieBuilder.getKieModule();return kieServices.newKieContainer(kieModule.getReleaseId());}
}
订单实体类
Order
类是一个简单的Java Bean,包含订单金额和积分两个属性。
@Data
public class Order {private double amount;private double score;
}
订单积分规则
我们在Drools的规则文件中定义了几条规则,这些规则根据订单金额的不同来设置相应的积分。
rule "order_rule_1"when$order:Order(amount < 100)then$order.setScore(0);System.out.println("成功匹配到规则一:100元以下 不加分");
endrule "order_rule_2"when$order:Order(amount >= 100 && amount < 500)then$order.setScore(100);System.out.println("成功匹配到规则二:100元 - 500元 加100分");
endrule "order_rule_3"when$order:Order(amount >= 500 && amount < 1000)then$order.setScore(500);System.out.println("成功匹配到规则三:500元 - 1000元 加500分");
endrule "order_rule_4"when$order:Order(amount >= 1000)then$order.setScore(1000);System.out.println("成功匹配到规则四:1000元以上 加1000分");
end
测试规则
最后,我们通过一个简单的测试类来验证这些规则是否能够正确匹配。
@SpringBootTest
class DroolsApplicationTests {@Resourceprivate KieContainer kieContainer;@Testpublic void test() {KieSession session = kieContainer.newKieSession();Order order = new Order();order.setAmount(1300);session.insert(order);session.fireAllRules();session.dispose();System.out.println("订单金额:" + order.getAmount() + ",添加积分:" + order.getScore());}
}
在这个测试中,订单金额为1300,根据规则四的定义,应该为订单添加1000分。运行测试后,我们会看到对应的输出。
总结
通过这个简单的例子,我们可以看到如何使用Spring Boot和Drools来实现业务规则的管理。这种方式不仅使得规则的管理更加灵活,同时也让代码的维护变得更加简单。如果你在项目中也有类似的需求,何不尝试一下这种方法呢?希望这篇文章对你有所帮助!
相关文章:
Spring Boot整合Drools入门:实现订单积分规则
文章目录 项目结构Maven配置配置Drools订单实体类订单积分规则测试规则总结 在开发过程中,我们经常遇到需要根据业务规则来进行决策的场景。比如,电商平台可能需要根据订单金额为用户添加相应的积分。为了灵活地处理这些业务规则,我们可以借助…...

【C语言】文件操作函数详解
目录 C语言文件操作函数详解表格汇总1. fopen2. fclose3. fread4. fwrite5. fseek6. ftell7. rewind8. fprintf9. fscanf10. feof11. ferror12. clearerr13. 总结14. 附录:函数参考表15. 结束语相关文章: C语言文件操作函数详解 C语言提供了一组标准库函…...

Java 垃圾回收,看一遍就懂
了解 Java 垃圾收集的工作原理并优化应用程序中的内存使用情况。详细了解 Java 中内存管理的复杂性。 垃圾收集是一个关键过程,可以帮助任何Java 开发公司。编程语言中的这一强大功能可以巧妙地管理内存分配和释放,防止内存泄漏并优化资源利用率。它就像…...

手把手教你CNVD漏洞挖掘 + 资产收集
0x1 前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖,但是一般要挖证书的话,还是需要花时间的,其中信息收集,公司资产确定等操作需要花费一定时间的。下面就记录下我之前跟一个师傅学习的一个垂直越权成功的CNVD漏洞通杀&#…...

华为云低代码AstroZero技巧教学1:表格的超链接赋能
在低代码AstroZero的标准页面设计和构建上,我们总是在思考如何让用户体验能够更加流畅。 为此,我们特推出低代码AstroZero技巧教学系列合集,让各位开发者能够更加方便快捷地掌握低代码AstroZero的操作技巧。 本次技巧内容: 在As…...

https握手过程详解
https握手过程详解 上一篇《HTTPS通讯全过程》中https握手过程实际上还有更多的细节,为什么会这样设计呢?是因为一开始将握手过程时,吧步骤说的太详细会导致更难理解惹。所以我就先在上一篇把部分细节忽略,把原来几步的过程先简化…...

Lesson 63 Thank you, doctor
Lesson 63 Thank you, doctor 词汇 better a. 更好的 搭配:feel better get better 感觉好些了 成语:Better late than never. 晚做总比不做好。 Half a loaf is better than no bread. 有比没有好。…...
使用python和matlab实现BP神经网络算法的分析比较
分析和比较使用Python和MATLAB实现BP神经网络算法实现的复杂度、代码可读性、库支持、性能以及应用的灵活性等。 1. BP神经网络的基本原理 BP神经网络(Back Propagation Neural Network)是一种多层前馈神经网络,通过反向传播算法来训练网络。其基本思想是利用梯度下降法,…...

智慧卫生间环境传感器有哪些?智慧卫生间的特点@卓振思众
随着科技的进步和人们对生活品质的要求不断提高,智慧卫生间作为现代化设施的代表,越来越受到关注。智慧卫生间不仅仅是在外观设计上做文章,更在于其背后强大的智能系统,特别是环境传感器的应用,让厕所的管理和使用变得…...

智能分班结果自动发布系统
新学期,校园里又将迎来一批充满活力的新生。对于老师们来说,除了准备教学计划和课程内容,还有一项看似简单却颇为繁琐的任务——发布分班。传统的分班信息发布方式,通常是老师们一个个私信给学生家长,家长们收到信息后…...
vue 后台管理 指定项目别名
越多越好 文章目录 一、指定项目路径别名二、全局loading进度条实现三、动态页面标题的实现四、全局刷新 和 全屏 一、指定项目路径别名 在 vite.config.js 里配置 import path from "path"export default defineConfig({resolve:{alias:{"~":path.resol…...

【Python机器学习】FP-growth算法——构建FP树
在第二次扫描数据集时会构建一棵FP树。为构建一棵树,需要一个容器来保存树。 创建FP树的数据结构 FP树要比书中其他树更加复杂,因此需要创建一个类来保存树的每一个节点: class treeNode:def __init__(self,nameValue,numOccur,parentNode…...

JAVA itextpdf 段落自动分页指定固定行距打印
JAVA itextpdf 段落自动分页指定固定行距打印 前言:公司有个需求,打印的合同模板左上角要加上logo的图标。但是itext pdf 自动分页会按照默认的顶部高分页打印内容的,导致从第二页开始logo图标就会把合同的内容给覆盖掉了。然后尝试了挺多方法…...

基于SpringBoot+Vue的周边游平台个人管理模块的设计与实现
TOC springboot220基于SpringBootVue的周边游平台个人管理模块的设计与实现 第一章 绪论 1.1 选题背景 目前整个社会发展的速度,严重依赖于互联网,如果没有了互联网的存在,市场可能会一蹶不振,严重影响经济的发展水平…...

开源数据库同步工具monstache
Monstache是一个用Go语言编写的同步工具,主要用于将MongoDB中的数据同步到Elasticsearch中。它支持全量同步和增量同步,并提供了丰富的配置参数以及使用Go、JavaScript编写插件来自定义处理数据的逻辑的能力。Monstache 工作流程如下图: 以下…...

Ubuntu连接GitHub
报错:Please make sure you have the correct access rights and the repository exists.原因:本地没有SSH Key存在解决: 首先为系统设置github的用户名和自己的邮箱 git config --global user.name "****" git config --global us…...
微信支付流程
1. 创建订单 请求创建订单的 API 接口:把 订单金额、收货地址、订单中包含的商品信息 发送到服务器服务器响应的结果:订单编号 2.订单预支付 请求订单预支付的 API 接口:把步骤1得到的 订单编号 发送到服务器服务器响应的结果:…...

LVS理论知识
目录 1.描述以及工作原理 1.什么是LVS 2.LVS调度算法 1.静态调度算法 1.轮询RR 2.加权轮询WRR 3.目标地址hash---DH 4.源地址hash---SH 2.动态调度算法 1.LC最少连接 2.wlc加权最少连接 3.sed最少期望延迟 4.nq不排队调度算法 5.lblc基于本地最少连接 6.lnlcr带…...

uniapp接口请求this.$request
代码示例: createPhoto(url) {this.$request({url: /emp/gallery-photo/create,//后端接口method: post,//请求方法header: {//请求头tenant-id: 1,},data: {//请求参数galleryId: this.albumId,empUserId: this.empUserId,"url": url,}}).then((res) &…...

vulnhub靶机 W34KN3SS(渗透测试详解)
一、靶机信息收集 1、靶机下载地址 https://download.vulnhub.com/w34kn3ss/W34KN3SS.ova 2、扫描靶机IP 3、探测靶机端口、主机、服务版本信息 nmap -sS -sV -A -p- 192.168.31.160 4、进行目录扫描 二、web渗透测试 1、访问靶机IP 没什么发现 2、进行目录拼接访问 拼接…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...