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/28 15:47:22 阅读更多 →
ncmdump:彻底解决网易云音乐NCM加密格式的终极转换指南

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

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

2026/11/4 15:39:47 阅读更多 →
Superset 自定义配置指南:从入门到生产环境实战

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

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

2026/11/4 8:42:06 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/5 12:28:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/5 12:28:01 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/5 12:28:02 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻