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

相关推荐
宸津-代码粉碎机2 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
噢,我明白了3 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅3 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
GreenTea3 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
考虑考虑3 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1114 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383004 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
Escalating_xu4 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
周杰偷奶茶4 小时前
【Java】数据类型与变量
java·开发语言
code斗4 小时前
Java数据结构:堆详解
java·开发语言·数据结构