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

相关推荐
MacroZheng12 小时前
让 Claude Code 成本爆降 89%,这个开源工具有点猛...
java·人工智能·后端
likerhood12 小时前
Java 异常处理:从 try-catch-finally 到项目最佳实践
java·开发语言·php
_Evan_Yao12 小时前
游戏和编程两不误:用Unity做一个简单小游戏
后端·游戏·unity·游戏引擎
咕噜咕噜啦啦12 小时前
从spring到spring boot——JAVA项目开发
java·前端·spring boot·后端·spring
Gopher_HBo12 小时前
DNS和HTTP DNS
后端
asdfg125896312 小时前
使用正则表达式str.split(“\\W+“)拆分句子
java·正则表达式
今天背单词了吗98012 小时前
MySQL InnoDB引擎八大核心特性详解(高频面试题)
java·数据库·mysql
专注VB编程开发20年12 小时前
b4a用VB语言开发安卓APP-图片缩放库ZoomImageView讲解-双指缩放 + 单指拖动核心源码
android·java·前端
Sinsa_SI12 小时前
2026算法应用主题赛初赛-小学4-6组(c++)试卷(含答案+详细解析)
java·c++·算法