后端与系统架构5448 字
Spring状态机最佳实践
·全库 521 / 611
《Spring状态机最佳实践》共 0.5 万字,通篇围绕 Redis、数据库、MySQL、并发 展开,归在「后端与系统架构」这一层。
覆盖Redis数据库MySQL并发缓存工作流
适合给 AI 系统搭底座、要管得住的人
目录骨架(4 节)
- 什么是Spring的状态机
- Spring 状态机快速上手
- spring状态机
- 完整订单演示代码
什么是Spring的状态机
- Spring 状态机(Spring State Machine)是 Spring Framework 提供的一个模块,用于支持有限状态机(Finite State Machine,FSM)的实现。有限状态机是一个数学模型,描述了一个系统在不同状态之间的转换以及触发这些转换的事件。
- Spring 状态机主要用于处理对象的状态变化和状态之间的转换。它提供了一种以声明性的方式定义状态和状态之间转换的机制,并能够处理各种事件触发的状态迁移。这在某些应用中非常有用,比如工作流、订单处理、游戏引擎等领域。
- Spring StatsMachine主要涉及到两个重要的概念,一个是State(状态)、一个是Event(事件)。

Spring 状态机快速上手
- 场景:商城项目中对于订单状态的层层转换。
1.使用Spring状态机先引入它的Maven依赖
<!-- 状态机-->
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-starter</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!-- Spring State Machine Redis -->
<dependency>
<groupId>org.springframework.statemachine</groupId>
<artifactId>spring-statemachine-redis</artifactId>
</dependency>
2.生成状态机的状态与事件:(OrderState,OrderEvents)
- OrderState:
public enum OrderState {
UNPAID, // 待支付
WAITING_FOR_RECEIVE, // 待收货
DONE // 结束
}
- OrderEvents
public enum OrderEvents {
PAY, // 支付
RECEIVE // 收货
}
3.将状态与事件进行绑定:(StateMachineConfig)
@Configuration
@EnableStateMachine(name = "StateMachineConfig")
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<TestState, TestEvents> {
private Logger logger = LoggerFactory.getLogger(getClass());
//定义初始状态
@Override
public void configure(StateMachineStateConfigurer<TestState, TestEvents> states)
throws Exception {
states
.withStates()
.initial(TestState.UNPAID)
.states(EnumSet.allOf(TestState.class));
}
//状态转换过程 触发什么事件就转换为什么状态
@Override
public void configure(StateMachineTransitionConfigurer<TestState, TestEvents> transitions)
throws Exception {
transitions
.withExternal()
.source(TestState.UNPAID).target(TestState.WAITING_FOR_RECEIVE)
.event(TestEvents.PAY)
.and()
.withExternal()
.source(TestState.WAITING_FOR_RECEIVE).target(TestState.DONE)
.event(TestEvents.RECEIVE);
}
}
4.将事件监听触发与配置类进行配置:(EventListener)
@Component
@WithStateMachine(name = "StateMachineConfig")
public class EventListener {
private Logger logger = LoggerFactory.getLogger(getClass());
@OnTransition(target = "UNPAID")
public boolean create(Message<Order> order) {
// 创建订单逻辑
logger.info("订单创建,待支付");
return true;
}