Spring Statemachine 是一个供应用程序开发人员在 Spring 应用程序中使用状态机概念的框架。

Spring Statemachine 旨在提供以下功能:

  • 用于简单用例的易于使用的扁平一级状态机。
  • 用于简化复杂状态配置的分层状态机结构。
  • 用于提供更复杂状态配置的状态机区域。
  • 使用触发器、转换、守卫和动作。
  • 类型安全的配置适配器。
  • 用于在 Spring 应用程序上下文之外轻松实例化的构建器模式。
  • 常见用例的示例。
  • 基于 Zookeeper 的分布式状态机。
  • 状态机事件监听器。
  • UML Eclipse Papyrus 建模。
  • 将状态机配置存储在持久存储中。
  • Spring IOC 集成,将 Bean 与状态机关联。

状态机之所以强大,是因为行为始终保持一致,这使得调试相对容易。这是因为在启动机器时,操作规则被固定下来。这个想法是,你的应用程序可能存在于有限数量的状态,并且某些预定义的触发器可以将您的应用程序从一个状态带到下一个状态。这些触发器可以基于事件或计时器。

在应用程序之外定义高级逻辑然后依赖状态机来管理状态要容易得多。你可以通过发送事件与状态机进行交互,监听变化或仅请求当前状态。

前言

状态机的概念很可能比本参考文档的任何读者都要古老,绝对比Java语言本身还要古老。有关有限自动机的描述可以追溯到1943年,当时Warren McCulloch先生和Walter Pitts先生撰写了一篇论文。后来,George H. Mealy在1955年提出了状态机概念(称为“Mealy机”)。一年后的1956年,Edward F. Moore发表了另一篇论文,其中描述了所谓的“Moore机”。如果你曾经阅读过有关状态机的任何内容,Mealy和Moore这两个名字应该在某个时候出现过。

本参考文档包括以下几个部分:

介绍

Spring状态机(SSM)是一个框架,允许应用程序开发人员在Spring应用程序中使用传统的状态机概念。SSM提供了以下功能:

  • 用于简单用例的易于使用的扁平(单级)状态机。
  • 用于简化复杂状态配置的分层状态机结构。
  • 提供更复杂状态配置的状态机区域。
  • 使用触发器、转换、守卫和动作。
  • 类型安全的配置适配器。
  • 状态机事件监听器。
  • Spring IoC集成,将Bean与状态机关联起来。

在继续之前,我们建议查阅附录中的术语表状态机速成课程,以获取关于状态机是什么的一般性概念。接下来的文档内容假设您已经熟悉状态机的概念。

背景

状态机之所以强大,是因为它们的行为始终保持一致,而且相对容易调试,因为当启动状态机时,操作规则是固定的。这个想法是,您的应用程序现在处于一种状态,可能存在于有限数量的状态中。然后会发生某些事情,将应用程序从一个状态转移到下一个状态。状态机由触发器驱动,这些触发器基于事件或定时器。

将高级逻辑设计在应用程序之外,然后以各种不同的方式与状态机进行交互,会更加容易。您可以通过发送事件与状态机进行交互,监听状态机的操作,或者请求当前状态。

传统上,当开发人员意识到代码基础开始变得杂乱无章时,才会将状态机添加到现有项目中。杂乱无章的代码看起来像是一个永无止境的分层结构,由IF、ELSE和BREAK子句组成,当事情开始变得太复杂时,编译器可能会建议开发人员回家休息。

使用场景

在以下情况下,项目是使用状态机的好候选对象:

  • 您可以将应用程序或其部分结构表示为状态。
  • 您希望将复杂逻辑拆分为更小的可管理任务。
  • 应用程序已经出现了并发问题,例如某些情况发生得异步。

当您:

  • 使用布尔标志或枚举来建模情况时。
  • 有仅在应用程序生命周期的某些部分才有意义的变量。
  • 遍历if-else结构(或更糟糕的是,多个这样的结构),检查特定标志或枚举是否已设置,然后对是否存在某些标志和枚举的组合进行进一步的例外处理,以及在存在或不存在时做出进一步的例外处理。

入门指南

如果您刚开始使用Spring状态机,这个部分适合您!在这里,我们将回答一些基本的“什么?”,“如何?”和“为什么?”问题。我们将从对Spring状态机的简要介绍开始。然后我们将构建我们的第一个Spring状态机应用程序,并在进行讨论时涵盖一些核心原则。

系统要求

Spring状态机3.2.1是使用JDK 8构建和测试的(所有构件都具有JDK 7兼容性),并且与Spring Framework 5.3.27一起进行了构建和测试。在其核心系统内部,它不需要任何其他依赖项。

其他可选部分(例如使用分布式状态)依赖于Zookeeper,而状态机示例 则依赖于 spring-shellspring-boot,这些库会引入除框架本身之外的其他依赖项。另外,可选的安全性和数据访问功能依赖于Spring Security和Spring Data模块。