spring状态机(不太优雅)笔记
文章目录什么是状态机事件、动作、业务的区别普通逻辑和状态机的区别集成及使用引入maven依赖定义状态枚举定义事件枚举初始化订单的状态集合以及状态转移事件状态转移的监听器测试听到这个名词一愣但是很快反应过来了就是状态和逻辑控制名词化了。当然和普通逻辑相比可不是改个名字而已有很多不同。什么是状态机Java状态机是一种用于描述系统状态转换的模型通过定义状态、事件、动作和转换规则来控制程序行为。其核心要素如下**状态States**系统可能处于的固定状态如订单状态中的已支付、“已发货等 。 ‌**事件Events**触发状态转换的外部或内部信号如支付”、“取消等操作 。 ‌**动作Actions**状态转换时执行的操作例如更新状态字段或记录日志 。 ‌**转换Transitions**定义事件触发下状态转移的规则例如支付成功事件将待支付状态转为支付成功”。这么看是否还得维护个状态表看起来才比较清楚。事件、动作、业务的区别这几个概念容易混淆。事件表示触发。动作要做的操作业务包含(事件动作)当然也可能有其他操作。普通逻辑和状态机的区别名称普通逻辑状态机逻辑清晰度需要if else来实现逻辑判断可读性差状态机通过预定义状态和事件将状态转换规则显式化避免冗余的条件判断可读性强。扩展性需要在原代码上修改逻辑易出错扩展性差。新增状态或事件时只需扩展状态机配置无需修改现有代码。线程安全支持需手动处理同步问题如使用synchronized或Lock实现复杂且易出错。状态机框架如Spring StateMachine内置线程同步机制确保并发场景下状态一致性。业务解耦状态处理常耦合在业务方法内难以独立测试。 ‌状态机将状态逻辑与业务代码分离便于测试和复用。可视化配置普通逻辑需通过代码硬编码状态转换可读性差。 ‌框架支持通过代码或配置文件定义状态机直观展示状态迁移路径。集成及使用引入maven依赖dependencygroupIdorg.springframework.statemachine/groupIdartifactIdspring-statemachine-core/artifactIdversion2.0.0.RELEASE/version/dependency!-- uml to code --dependencygroupIdorg.springframework.statemachine/groupIdartifactIdspring-statemachine-uml/artifactIdversion2.0.0.RELEASE/version/dependency定义状态枚举代码publicenumStates{UNPAID,// 待支付WAITING_FOR_RECEIVE,// 待收货DONE// 结束}定义事件枚举代码publicenumEvents{PAY,// 支付RECEIVE// 收货}初始化订单的状态集合以及状态转移事件代码publicclassStateMachineConfigextendsEnumStateMachineConfigurerAdapterStates,Events{privateLoggerLOGGERLoggerFactory.getLogger(getClass());Overridepublicvoidconfigure(StateMachineStateConfigurerStates,Eventsstates)throwsException{states.withStates().initial(States.UNPAID).states(EnumSet.allOf(States.class));}Overridepublicvoidconfigure(StateMachineTransitionConfigurerStates,Eventstransitions)throwsException{transitions.withExternal().source(States.UNPAID).target(States.WAITING_FOR_RECEIVE).event(Events.PAY).and().withExternal().source(States.WAITING_FOR_RECEIVE).target(States.DONE).event(Events.RECEIVE);}//守护BeanpublicGuardStates,Eventsguard(){returnnewGuardStates,Events(){publicbooleanevaluate(StateContextStates,Eventscontext){returntrue;}};}状态转移的监听器WithStateMachinepublicclassEventListener{privateLoggerLOGGERLoggerFactory.getLogger(getClass());OnTransition(targetUNPAID)publicvoidcreate(){//此处可以执行具体业务逻辑处理LOGGER.info(--------------------订单创建待支付-----------------------);}OnTransition(sourceUNPAID,targetWAITING_FOR_RECEIVE)publicvoidpay(){//此处可以执行具体业务逻辑处理LOGGER.info(--------------------用户完成支付待收货--------------------);}OnTransition(sourceWAITING_FOR_RECEIVE,targetDONE)publicvoidreceive(){//此处可以执行具体业务逻辑处理LOGGER.info(--------------------用户已收货订单完成----------------------);}}测试测试类代码RunWith(SpringRunner.class)SpringBootTestpublicclassApplicationTests{TestpublicvoidcontextLoads(){}AutowiredprivateStateMachineStates,EventsstateMachine;Testpublicvoidtest()throwsException{stateMachine.start();stateMachine.sendEvent(Events.PAY);stateMachine.sendEvent(Events.RECEIVE);}}1.只运行启动Testpublicvoidtest()throwsException{stateMachine.start();//springboot启动时开启 待支付//stateMachine.sendEvent(Events.PAY); //支付操作 待收货//stateMachine.sendEvent(Events.RECEIVE); //收货操作 结束}2.运行启动与支付操作Testpublicvoidtest()throwsException{stateMachine.start();//springboot启动时开启 待支付//stateMachine.sendEvent(Events.PAY); //支付操作 待收货//stateMachine.sendEvent(Events.RECEIVE); //收货操作 结束}3.全部执行Testpublicvoidtest()throwsException{stateMachine.start();//springboot启动时开启 待支付stateMachine.sendEvent(Events.PAY);//支付操作 待收货stateMachine.sendEvent(Events.RECEIVE);//收货操作 结束}

相关新闻

方便我开发的好东西(Claude、gpt、glm)

方便我开发的好东西(Claude、gpt、glm)

个人开发自用,且嫖且珍惜。排名不分先后,推荐指数纯个人主观意向。 网址注册渠道是否可签到可使用方式个人推荐指数优点备注vip-ai邮箱否cli⭐⭐⭐⭐⭐注册方便、稳、耐用非常耐用!倍率非常低pro aiL站或秋否cli⭐⭐⭐⭐⭐注册方便、稳、耐用…

2026/10/11 9:04:05 阅读更多 →
ncmdump:彻底解决网易云音乐NCM加密格式的终极转换指南

ncmdump:彻底解决网易云音乐NCM加密格式的终极转换指南

ncmdump:彻底解决网易云音乐NCM加密格式的终极转换指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现在其他播放器或设备上无法播放?这正是NCM加…

2026/10/11 17:22:48 阅读更多 →
Superset 自定义配置指南:从入门到生产环境实战

Superset 自定义配置指南:从入门到生产环境实战

1. Superset 配置入门:为什么需要自定义配置 Superset 作为 Apache 旗下的开源数据可视化工具,其核心配置文件 config.py 暴露了数百个可配置参数。这个设计理念源于 Flask 框架的模块化思想——通过继承和覆盖实现灵活配置,而非直接修改源…

2026/10/11 17:22:55 阅读更多 →

最新新闻

通达信【上涨能量】副图中短阻力一目了然

通达信【上涨能量】副图中短阻力一目了然

N:100;M:1;P:20; MAV:(C*2HL)/4; SK : EMA(MAV,1) - EMA(MAV,40); SD : EMA(SK,5); B:(SK-SD)*N; 短线拉升:IF(B<-20,-20,IF(B>100,100,B)),COLORRED,LINETHICK2; T:(C-LLV(1.02*L,20))/(HHV(H,20)-LLV(L,20))*100; 上涨量能:IF(T>100,100,IF(T<0,0,T)),COLORFF00F…

2026/10/11 17:24:15 阅读更多 →
SQL课程设计实战:宾馆房间管理系统从ER图到存储过程全解析

SQL课程设计实战:宾馆房间管理系统从ER图到存储过程全解析

简介&#xff1a;SQL数据库课程设计宾馆房间管理系统是一份面向软件工程、数据库等相关专业学生的实践性课程设计报告&#xff0c;完整呈现基于关系数据库原理的宾馆客房管理系统分析与设计流程&#xff0c;重点涉及SQL Server 2000与C#.NET联机应用开发。资源包内仅含1个doc文…

2026/10/11 17:24:15 阅读更多 →
WinRing0源码解析:驱动编译、加载与硬件访问实战

WinRing0源码解析:驱动编译、加载与硬件访问实战

简介&#xff1a;WinRing0 源码是一份面向 Windows 内核驱动开发、系统底层调试与硬件访问研究者的技术资源&#xff0c;核心价值在于提供用户态 DLL 与内核驱动协同工作的完整实现&#xff0c;帮助开发者理解如何绕过常规系统调用层直接读写 CPU 寄存器、I/O 端口与内存地址。…

2026/10/11 17:24:15 阅读更多 →
SQL Server 2008 R2 CPU与内存分配优化:max server memory、MAXDOP与并行度阈值调优实战

SQL Server 2008 R2 CPU与内存分配优化:max server memory、MAXDOP与并行度阈值调优实战

简介&#xff1a;这份文档面向SQL Server数据库管理员与解决方案供应商&#xff0c;聚焦SQL Server 2008 R2中CPU与内存资源的分配优化问题。相比SQL Server 2005依赖独立实例与处理器亲和性的做法&#xff0c;2008 R2引入的资源控制器可通过SQL Server Management Studio定义资…

2026/10/11 17:24:15 阅读更多 →
图书馆管理系统数据流图实战:DFD分层分解与数据字典设计全指南

图书馆管理系统数据流图实战:DFD分层分解与数据字典设计全指南

简介&#xff1a;这是一份围绕图书馆管理系统展开的系统分析设计文档&#xff0c;以数据流图&#xff08;DFD&#xff09;为核心&#xff0c;面向软件工程、系统分析与设计相关课程的学生及备考人员。内容从系统任务、组织结构与业务流程入手&#xff0c;按0层、1层、2层逐级拆…

2026/10/11 17:24:15 阅读更多 →
铁路窗口售票系统需求分析:从业务边界到异常流的完整拆解

铁路窗口售票系统需求分析:从业务边界到异常流的完整拆解

简介&#xff1a;中国铁路窗口售票系统需求分析文档&#xff0c;面向软件开发人员、软件工程专业学生、需求分析学习者以及铁路售票系统设计初学者&#xff0c;可作为课程报告、毕业设计或实际项目需求阶段的参考蓝本。文档围绕系统总体目标、功能要求、体系架构、业务需求、票…

2026/10/11 17:23:15 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →