Spring StateMachine 功能全面但偏重,COLA StateMachine 轻量简洁但功能有限。
下面从多个维度详细对比 Spring Boot 状态机 与 com.alibaba.cola 中的状态机组件。
一、核心区别概览
| 特性 | Spring StateMachine | COLA StateMachine |
|---|---|---|
| 所属框架 | Spring 官方 | 阿里 COLA 架构(应用架构层) |
| 定位 | 通用状态机引擎 | 轻量级领域状态机 |
| 状态机模型 | 基于 StateMachine、State、Transition | 基于 State、Event、Transition 接口 |
| 配置方式 | 注解 + 构建器 + 状态机图 | 纯编程式(Builder/Factory) |
| 能力范围 | 嵌套状态、正交、区域、选择、历史等高级功能 | 基础状态流转(适合 80% 场景) |
| 事务集成 | 与 Spring 事务无缝集成 | 无,需自行处理 |
| 监控/可视化 | 内置 PlantUML 状态图生成、事件监听器 | 无 |
| 持久化 | 支持内存/Redis/DB 存储状态机实例 | 不支持,需业务自行持久化 |
| 性能 | 较重(反射、状态机实例开销大) | 极轻(纯内存计算,无反射) |
| 学习曲线 | 陡峭 | 平缓 |
| 依赖范围 | 需引入 spring-statemachine-core(约 500KB+ 传递依赖) | 单个类文件(StateMachine、Builder 等几个类) |
二、代码示例对比
1. COLA StateMachine(简洁轻量)
java
// 定义状态、事件、上下文
public enum OrderStatus { INIT, PAID, SHIPPED, RECEIVED }
public enum OrderEvent { PAY, SHIP, RECEIVE }
public class OrderContext { Long orderId; }
// 构建状态机
StateMachineBuilder<OrderStatus, OrderEvent, OrderContext> builder = new StateMachineBuilder<>();
builder.externalTransition()
.from(OrderStatus.INIT).to(OrderStatus.PAID).on(OrderEvent.PAY)
.when(ctx -> ctx.getOrderId() != null) // 条件
.perform(ctx -> System.out.println("支付成功"));
builder.externalTransition()
.from(OrderStatus.PAID).to(OrderStatus.SHIPPED).on(OrderEvent.SHIP)
.perform(ctx -> sendGoods());
StateMachine<OrderStatus, OrderEvent, OrderContext> machine = builder.build("orderSM");
OrderStatus next = machine.fireEvent(OrderStatus.INIT, OrderEvent.PAY, new OrderContext());
2. Spring StateMachine(功能完整)
java
@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter<OrderStatus, OrderEvent> {
@Override
public void configure(StateMachineStateConfigurer<OrderStatus, OrderEvent> states) throws Exception {
states.withStates()
.initial(OrderStatus.INIT)
.state(OrderStatus.PAID)
.end(OrderStatus.RECEIVED);
}
@Override
public void configure(StateMachineTransitionConfigurer<OrderStatus, OrderEvent> transitions) throws Exception {
transitions
.withExternal()
.source(OrderStatus.INIT).target(OrderStatus.PAID).event(OrderEvent.PAY)
.action(payAction())
.and()
.withExternal()
.source(OrderStatus.PAID).target(OrderStatus.SHIPPED).event(OrderEvent.SHIP)
.guard(shippableGuard());
}
@Bean
public Action<OrderStatus, OrderEvent> payAction() {
return ctx -> System.out.println("支付处理");
}
}
// 使用
@Autowired
private StateMachine<OrderStatus, OrderEvent> stateMachine;
// 需要启动、发送事件、停止(多个步骤)
stateMachine.start();
stateMachine.sendEvent(OrderEvent.PAY);
OrderStatus current = stateMachine.getState().getId();
stateMachine.stop();
三、何时选用 COLA StateMachine?
适用场景:
-
状态数 < 20,流转逻辑简单(无嵌套、无并行)
-
需要极高性能(如网关、高频交易)
-
希望代码零配置、完全可控
-
不希望引入 Spring 依赖(例如在领域层使用)
-
快速实现 DDD(领域驱动设计)中的状态模式
典型项目:中小型业务系统、微服务中的单个领域服务
四、何时选用 Spring StateMachine?
适用场景:
-
状态流转复杂(嵌套/正交/历史状态)
-
需要状态机持久化(长时间运行流程)
-
与 Spring 生态系统深度集成(如结合 Spring Cloud Stream、Spring Batch)
-
需要可视化监控(生成状态图用于文档)
-
团队成员熟悉 Spring 扩展机制
典型项目:审批工作流、订单生命周期长流程(购物 + 退货 + 售后)、IoT 设备状态机
五、结合 COLA 架构的推荐做法
COLA 架构(com.alibaba.cola)的分层是:Adapter → App → Domain → Infra。
-
在 Domain 层 :推荐使用 COLA StateMachine(因为 Domain 层应保持无框架依赖,只依赖 POJO + 领域服务)
-
在 App 层 :可封装使用 Spring StateMachine(作为应用流程编排)
java
// Domain 层定义状态机(使用 COLA)
public class OrderDomainService {
private StateMachine<OrderStatus, OrderEvent, OrderContext> orderSM;
public void handleEvent(OrderEntity order, OrderEvent event) {
OrderContext ctx = new OrderContext(order.getId());
OrderStatus newStatus = orderSM.fireEvent(order.getStatus(), event, ctx);
order.setStatus(newStatus);
}
}
六、总结建议
| 需求 | 推荐 |
|---|---|
| 你的项目是 DDD + COLA 架构 | ✅ COLA StateMachine(放在 Domain 层) |
| 需要状态机的高阶功能(嵌套/并行/持久化) | ✅ Spring StateMachine |
| 追求极致性能,状态流转 < 1000 万次/天 | ✅ COLA StateMachine |
| 流程长(需要从 DB 恢复状态机实例) | ✅ Spring StateMachine |
| 快速原型,简单几个状态 | ✅ COLA StateMachine |
一句话结论 :COLA 的状态机够用且轻量,适合绝大多数业务系统的领域层;Spring StateMachine 强大但笨重,仅在确实需要高级功能时才引入。
如果需要,我可以给你提供一个完整的 COLA + COLA StateMachine 的订单状态机示例代码。