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

相关推荐
kuro-shiro11 小时前
SpringBoot 启动流程
java·spring boot·后端
吴声子夜歌11 小时前
SQL进阶——EXISTS谓词
java·数据库·sql
偏爱自由 !11 小时前
8. 泛型程序设计
java·开发语言·windows
剑挑星河月11 小时前
35.搜索插入位置
java·数据结构·算法·leetcode
海兰11 小时前
【SpringBoot 】AOP企业级权限控制方案(二)
android·java·spring boot
偏爱自由 !11 小时前
2:IDEA中git的使用--基础操作
java·git·intellij-idea
ch.ju11 小时前
Java Programming Chapter 4——Class loading
java·开发语言
LiaoWL12311 小时前
【SpringBoot合集-03】Spring Boot 启动过程学习
java·spring boot·学习
孟浩浩13 小时前
JAVA SpringAI+阿里云百炼应用开发
java·开发语言·阿里云
钱多多_qdd13 小时前
ListUtil#split和remove搭配使用的坑
java