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、进行目录拼接访问 拼接…...
5分钟部署Sambert语音合成:多情感中文TTS开箱即用,新手零门槛
5分钟部署Sambert语音合成:多情感中文TTS开箱即用,新手零门槛 1. 引言:为什么选择这个语音合成镜像 想象一下,你正在开发一个智能客服系统,需要让AI用不同的语气和音色与用户交流。传统语音合成方案要么配置复杂&…...
2026年最新出炉!汉中装修公司口碑排行榜大揭秘来了!
装修是一件大事,关乎着未来生活的品质和舒适度。在汉中,众多装修公司让人眼花缭乱,如何选择一家靠谱的装修公司成为了许多业主的难题。今天,我们就来揭秘2026年汉中装修公司口碑排行榜,重点推荐汉中恒丰装饰࿰…...
Windows下OpenClaw部署教程:对接GLM-4.7-Flash模型详解
Windows下OpenClaw部署教程:对接GLM-4.7-Flash模型详解 1. 为什么选择OpenClawGLM-4本地组合 去年我在处理日常办公自动化时,发现很多重复性工作既不适合用Python脚本硬编码,又不想把敏感数据传到第三方SaaS平台。直到遇到OpenClaw这个开源…...
开源协作机器人的架构革命:OpenArm如何重构机器人研发范式
开源协作机器人的架构革命:OpenArm如何重构机器人研发范式 【免费下载链接】openarm OpenArm v0.1 项目地址: https://gitcode.com/GitHub_Trending/op/openarm 当传统工业机械臂的封闭生态成为技术创新的桎梏,当高昂的硬件成本将学术研究拒之门外…...
从视频处理到医疗影像:Conv3D输出形状计算中的那些‘坑’与高效设计指南
从视频处理到医疗影像:Conv3D输出形状计算中的那些‘坑’与高效设计指南 当你在深夜调试一个3D卷积神经网络时,突然发现输出的特征图尺寸比预期小了整整一半——这种场景对于处理视频分类或医疗影像的工程师来说再熟悉不过了。Conv3D层看似简单的参数设…...
Kali桥接模式实战:从静态IP到动态DHCP的完整网络配置指南
1. 为什么需要桥接模式? 很多刚接触Kali Linux的朋友都会有这样的疑问:为什么虚拟机要配置桥接模式?简单来说,桥接模式让虚拟机就像一台真实存在的物理设备一样接入网络。想象一下你家里新买了一台电脑,插上网线就能直…...
揭秘Demucs:音频分离背后的跨域Transformer技术革命
揭秘Demucs:音频分离背后的跨域Transformer技术革命 【免费下载链接】demucs Code for the paper Hybrid Spectrogram and Waveform Source Separation 项目地址: https://gitcode.com/gh_mirrors/de/demucs 在音频处理的广阔领域中,音乐源分离技…...
快速部署PyTorch 2.5:预装CUDA环境实战教程
快速部署PyTorch 2.5:预装CUDA环境实战教程 本文是一篇基础教程类文章,旨在帮助开发者快速上手使用预装了PyTorch 2.5和CUDA环境的深度学习镜像。无论你是刚接触深度学习的新手,还是需要快速搭建开发环境的老手,这篇教程都能让你…...
GTE中文-large多任务能力展示:同一输入文本同步输出NER标签+情感得分+分类结果
GTE中文-large多任务能力展示:同一输入文本同步输出NER标签情感得分分类结果 提示:本文展示的GTE中文-large模型多任务能力基于ModelScope的iic/nlp_gte_sentence-embedding_chinese-large镜像实现,所有示例均为真实运行结果。 1. 多任务模型…...
驱动级输入模拟技术:突破Windows系统限制的Interceptor解决方案
驱动级输入模拟技术:突破Windows系统限制的Interceptor解决方案 【免费下载链接】Interceptor C# wrapper for a Windows keyboard driver. Can simulate keystrokes and mouse clicks in protected areas like the Windows logon screen (and yes, even in games).…...
