最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

StateMachine 狀態(tài)機機制深入解析

 更新時間:2019年08月22日 09:44:40   作者:梁桂釗  
這篇文章主要介紹了,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

Spring StateMachine 讓狀態(tài)機結構更加層次化,可以幫助開發(fā)者簡化狀態(tài)機的開發(fā)過程。

之前,我們使用二維數(shù)組實現(xiàn)狀態(tài)機機制,現(xiàn)在,我們來用 Spring StateMachine 進行改造。

環(huán)境依賴

修改 POM 文件,添加 spring-statemachine-core 依賴。

<dependency>
 <groupId>org.springframework.statemachine</groupId>
  <artifactId>spring-statemachine-core</artifactId>
  <version>1.2.0.RELEASE</version>
</dependency>

狀態(tài)和事件

現(xiàn)在,我以用戶注冊為案例,來講解狀態(tài)和事件之間的狀態(tài)機機制。

狀態(tài)枚舉

注冊有哪些狀態(tài)呢,我們來想想,應該有4個狀態(tài):未連接、已連接、注冊中、已注冊。

public enum RegStatusEnum {
  // 未連接
  UNCONNECTED,
  // 已連接
  CONNECTED,
  // 注冊中
  REGISTERING,
  // 已注冊
  REGISTERED; 
}

事件枚舉

相對應的,存在幾個核心事件:連接、注冊、注冊成功、注冊失敗、注銷。

public enum RegEventEnum {
  // 連接
  CONNECT,
  // 注冊
  REGISTER,
  // 注冊成功
  REGISTER_SUCCESS,
  // 注冊失敗
  REGISTER_FAILED,
  // 注銷
  UN_REGISTER;
}

狀態(tài)機配置

@Configuration
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<RegStatusEnum, RegEventEnum> {
}

@EnableStateMachine注解,標識啟用 Spring StateMachine 狀態(tài)機功能。

初始化狀態(tài)機狀態(tài)

我們需要初始化狀態(tài)機的狀態(tài)。

@Override
public void configure(StateMachineStateConfigurer<RegStatusEnum, RegEventEnum> states) throws Exception {
  states.withStates()
  // 定義初始狀態(tài)
  .initial(RegStatusEnum.UNCONNECTED)
  // 定義狀態(tài)機狀態(tài)
  .states(EnumSet.allOf(RegStatusEnum.class));
} 

其中,initial(RegStatusEnum.UNCONNECTED) 定義了初始狀態(tài)是未連接狀態(tài)。states(EnumSet.allOf(RegStatusEnum.class)) 定義了定義狀態(tài)機中存在的所有狀態(tài)。

初始化狀態(tài)遷移事件

我們需要初始化當前狀態(tài)機有哪些狀態(tài)事件。

@Override
public void configure(StateMachineTransitionConfigurer<RegStatusEnum, RegEventEnum> transitions)
    throws Exception {
  transitions
    // 1.連接事件
    // 未連接 -> 已連接
    .withExternal()
      .source(RegStatusEnum.UNCONNECTED)
      .target(RegStatusEnum.CONNECTED)
      .event(RegEventEnum.CONNECT)
    .and()           
 
    // 2.注冊事件  
    // 已連接 -> 注冊中
    .withExternal()
      .source(RegStatusEnum.CONNECTED)
      .target(RegStatusEnum.REGISTERING)
      .event(RegEventEnum.REGISTER)
    .and()
 
    // 3.注冊成功事件  
    // 注冊中 -> 已注冊
    .withExternal()
      .source(RegStatusEnum.REGISTERING)
      .target(RegStatusEnum.REGISTERED)
      .event(RegEventEnum.REGISTER_SUCCESS)
    .and()
 
    // 5.注銷事件
    // 已連接 -> 未連接
    .withExternal()
      .source(RegStatusEnum.CONNECTED)
      .target(RegStatusEnum.UNCONNECTED)
      .event(RegEventEnum.UN_REGISTER)
    .and()
    // 注冊中 -> 未連接
    .withExternal()
      .source(RegStatusEnum.REGISTERING)
      .target(RegStatusEnum.UNCONNECTED)
      .event(RegEventEnum.UN_REGISTER)
    .and()
    // 已注冊 -> 未連接
    .withExternal()
      .source(RegStatusEnum.REGISTERED)
      .target(RegStatusEnum.UNCONNECTED)
      .event(RegEventEnum.UN_REGISTER)
    ;
}

這里,我以連接事件為案例,其中 source 指定原始狀態(tài),target 指定目標狀態(tài),event 指定觸發(fā)事件。

因此,下面的狀態(tài)就很好理解了,即當發(fā)生連接事件時,從未連接狀態(tài)變更為已連接狀態(tài)。

// 未連接 -> 已連接
.withExternal()
  .source(RegStatusEnum.UNCONNECTED)
  .target(RegStatusEnum.CONNECTED)
  .event(RegEventEnum.CONNECT)

狀態(tài)監(jiān)聽器

Spring StateMachine 提供了注解配置實現(xiàn)方式,所有 StateMachineListener 接口中定義的事件都能通過注解的方式來進行配置實現(xiàn)。

@WithStateMachine
public class StateMachineEventConfig { 
  @OnTransition(source = "UNCONNECTED", target = "CONNECTED")
  public void connect() {
    System.out.println("http:///////////////////");
    System.out.println("連接事件, 未連接 -> 已連接");
    System.out.println("http:///////////////////");
  } 
  @OnTransition(source = "CONNECTED", target = "REGISTERING")
  public void register() {
    System.out.println("http:///////////////////");
    System.out.println("注冊事件, 已連接 -> 注冊中");
    System.out.println("http:///////////////////");
  } 
  @OnTransition(source = "REGISTERING", target = "REGISTERED")
  public void registerSuccess() {
    System.out.println("http:///////////////////");
    System.out.println("注冊成功事件, 注冊中 -> 已注冊");
    System.out.println("http:///////////////////");
  } 
  @OnTransition(source = "REGISTERED", target = "UNCONNECTED")
  public void unRegister() {
    System.out.println("http:///////////////////");
    System.out.println("注銷事件, 已注冊 -> 未連接");
    System.out.println("http:///////////////////");
  }
}

這里,我仍然以連接事件為案例,@OnTransition 中 source 指定原始狀態(tài),target 指定目標狀態(tài),當事件觸發(fā)時將會被監(jiān)聽到從而調用 connect() 方法。

總結

Spring StateMachine 讓狀態(tài)機結構更加層次化,可以幫助開發(fā)者簡化狀態(tài)機的開發(fā)過程。

我們來回顧下幾個核心步驟

  • 定義狀態(tài)枚舉。
  • 定義事件枚舉。
  • 定義狀態(tài)機配置,設置初始狀態(tài),以及狀態(tài)與事件之間的關系。
  • 定義狀態(tài)監(jiān)聽器,當狀態(tài)變更時,觸發(fā)方法。

源代碼

相關示例完整代碼: springboot-action

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 詳解Java內存溢出的幾種情況

    詳解Java內存溢出的幾種情況

    這篇文章主要介紹了詳解Java內存溢出的幾種情況,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • SpringBoot對Controller進行單元測試的實現(xiàn)代碼 附亂碼解決方案

    SpringBoot對Controller進行單元測試的實現(xiàn)代碼 附亂碼解決方案

    這篇文章主要介紹了SpringBoot對Controller進行單元測試的實現(xiàn)代碼 附亂碼解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • java和Spring中觀察者模式的應用詳解

    java和Spring中觀察者模式的應用詳解

    這篇文章主要介紹了java和Spring中觀察者模式的應用,,具有一定的參考價值,感興趣的可以了解一下,希望能夠給你帶來幫助
    2021-10-10
  • Java8新特性之新日期時間庫的使用教程

    Java8新特性之新日期時間庫的使用教程

    這篇文章主要給大家介紹了關于Java8新特性之新日期時間庫使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • JVM中-D、-X、-XX參數(shù)的區(qū)別

    JVM中-D、-X、-XX參數(shù)的區(qū)別

    本文主要介紹了JVM中-D、-X、-XX參數(shù)的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java經典面試題匯總:JVM

    Java經典面試題匯總:JVM

    本篇總結的是JVM相關的面試題,后續(xù)會持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實習生或者已經工作的同行,如果發(fā)現(xiàn)錯誤還望大家多多包涵,不吝賜教,謝謝
    2021-07-07
  • Gradle的SpringBoot項目構建圖解

    Gradle的SpringBoot項目構建圖解

    這篇文章主要介紹了Gradle的SpringBoot項目構建圖解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 深入淺析SpringBoot中的自動裝配

    深入淺析SpringBoot中的自動裝配

    SpringBoot的自動裝配是拆箱即用的基礎,也是微服務化的前提。接下來通過本文給大家介紹SpringBoot中的自動裝配,感興趣的朋友跟隨腳本之家小編一起學習吧
    2018-05-05
  • idea報錯:程序包org.springframework.web.bind.annotation不存在

    idea報錯:程序包org.springframework.web.bind.annotation不存在

    在用本地的maven倉庫的時候會org.springframework.web.bind.annotation不存在的錯誤,本文就詳細的介紹一下解決方法,感興趣的可以了解下
    2023-08-08
  • Java中從Integer到Date的轉換方法

    Java中從Integer到Date的轉換方法

    這篇文章主要介紹了Java中integer怎么轉換date,在Java中,如果我們有一個Integer類型的數(shù)據,想要將其轉換為Date類型,本文給大家介紹了實現(xiàn)方法,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-05-05

最新評論

庆云县| 林芝县| 丰台区| 浦县| 绩溪县| 鹰潭市| 瑞丽市| 东乌| 宣化县| 永新县| 阿克苏市| 舞钢市| 白银市| 朝阳区| 寻甸| 剑阁县| 呼和浩特市| 泸水县| 独山县| 尤溪县| 女性| 元朗区| 蒲江县| 凤山县| 霸州市| 漾濞| 高安市| 根河市| 化隆| 齐齐哈尔市| 梅河口市| 曲麻莱县| 常山县| 奉新县| 图片| 湟中县| 丰顺县| 静宁县| 二连浩特市| 资源县| 宜黄县|