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

相关推荐
XIAEE10 分钟前
一个即时通讯项目是怎么长出来的:(Spring Boot 3 + Vue 3 微前端 + 悟空 IM + LiveKit)
java·spring
雾行0x0014 分钟前
粗排:如何在毫秒级筛出值得精排的内容?
后端·架构
D1213815 分钟前
从零用 C++17 写一个 API 网关:线程模型、控制面分离,以及三个真实 Bug
后端
Scene21615 分钟前
AgentScope Java 进阶:2.如何精准定义问题类型与处理“不确定性”?
后端
用户3459668152116 分钟前
在嵌入式 Linux 摄像头上跑 WebRTC:metaRTC 8.0 的 8 个坑与解法
后端
n876516 分钟前
Playwright Java WEB UI 自动化实现框架与逻辑
java·前端·ui
Java_AI工程师17 分钟前
Spring4 / SpringBoot1.x 老项目想接入 AI?不用升级框架!3 套无痛落地方案
java·人工智能·spring boot
BBmmo17 分钟前
Java Stream 的 filter 为什么看起来没运行?
java
今天早睡19 分钟前
用 State、Reducer 和条件边搭出可控循环
后端
站大爷IP19 分钟前
Python的字符串格式化把我坑惨了,原来f-string和format的区别这么大
后端