Spring Boot 状态机 与 com.alibaba.cola 中的状态机

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 的订单状态机示例代码。

相关推荐
牛奔3 分钟前
Go 如何打印调试深层或嵌套的结构体
开发语言·后端·golang
红烧大青虫9 分钟前
HarmonyOS应用开发实战:小事记 - 数据迁移策略:RDB 表结构变更的版本号管理与 onUpgrade 回调
后端·华为·harmonyos·鸿蒙系统
geovindu36 分钟前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
阳光是sunny2 小时前
LangGraph实战教程:defer延迟节点——让收尾工作自动排到最后
前端·人工智能·后端
前端工作日常2 小时前
我学习到的Java中domain和dto区别
java·后端
kite01212 小时前
Go语言Map深度解析与最佳实践
开发语言·后端·golang
阳光是sunny2 小时前
LangGraph实战教程:控制流详解
前端·人工智能·后端
码农学院2 小时前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
技术小结-李爽3 小时前
【工具】pom文件的<packaging>
java·maven
hold?fish:palm3 小时前
kv存储主从复制的设计与实现
c++·redis·后端