介绍
Spring Statemachine(SSM)是一个框架,供应用程序开发人员在Spring应用程序中使用传统的状态机概念。SSM旨在提供以下功能:
- 易于使用的单层状态机,用于简单的用例。
- 分层状态机结构可简化复杂的状态配置。
- 状态机区域提供甚至更复杂的状态配置。
- 触发器,过渡,防护和操作的使用。
- 键入安全配置适配器。
- 状态机事件监听器。
- Spring IOC集成,将Bean与状态机关联。
状态机之所以强大,是因为始终保证行为是一致的,因此调试起来相对容易。这是因为在启动机器时,操作规则是一成不变的。想法是,您的应用程序可能以有限数量的状态存在,并且某些预定义的触发器可以将您的应用程序从一种状态转移到另一种状态。这样的触发器可以基于事件或计时器。在应用程序外部定义高级逻辑,然后依靠状态机来管理状态要容易得多。您可以通过发送事件,侦听更改或仅请求当前状态来与状态机进行交互。
基础概念
先从状态机的定义入手,StateMachine,其中:
-
- StateMachine:状态机模型
- state:S-状态,一般定义为一个枚举类,如创建、待风控审核、待支付等状态
- event:E-事件,同样定义成一个枚举类,如订单创建、订单审核、支付等,代表一个动作。
一个状态机的定义就由这两个主要的元素组成,状态及对对应的事件(动作)
状态机-相关概念
- Transition: 节点,是组成状态机引擎的核心
- source:节点的当前状态
- target:节点的目标状态
- event:触发节点从当前状态到目标状态的动作
- guard:起校验功能,一般用于校验是否可以执行后续action
- action:用于实现当前节点对应的业务逻辑处理
- withChoice 当执行一个动作,可能导致多种结果时,可以选择使用choice+guard来跳转
- withInternal 我们支持三种不同类型的转换
external
,internal
和local
。转换是通过信号触发的,该信号是发送到状态机的事件或计时器。
@Configuration
@EnableStateMachine
public class Config1Enums extends EnumStateMachineConfigurerAdapter<States, Events> {
@Override
public void configure(StateMachineStateConfigurer<States, Events> states)
throws Exception {
states
.withStates()
.initial(States.S1) // 自定义初始状态枚举
.end(States.SF) //最终状态枚举。可以多个
.choice(States.SC)//一个伪状态,表示1:N子状态
.states(EnumSet.allOf(States.class));
}
}
Spring stateMachine 提供了很多更加复杂状态扭转方式,可以查看官网:https://docs.spring.io/spring-statemachine/docs/2.0.2.RELEASE/reference/htmlsingle/#glossary
框架搭建
1.POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-in