Spring中StateMachine狀態(tài)機的機制原理

本篇內(nèi)容主要講解“Spring中StateMachine狀態(tài)機的機制原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Spring中StateMachine狀態(tài)機的機制原理”吧!

創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元六盤水做網(wǎng)站,已為上家服務(wù),為六盤水各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

前言

Spring StateMachine 讓狀態(tài)機結(jié)構(gòu)更加層次化,可以幫助開發(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)呢,我們來想想,應(yīng)該有4個狀態(tài):未連接、已連接、注冊中、已注冊。

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

事件枚舉

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

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

狀態(tài)機配置

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

@EnableStateMachine注解,標(biāo)識啟用 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)遷移事件

我們需要初始化當(dāng)前狀態(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 指定目標(biāo)狀態(tài),event 指定觸發(fā)事件。

因此,下面的狀態(tài)就很好理解了,即當(dāng)發(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("///////////////////");
    System.out.println("連接事件, 未連接 -> 已連接");
    System.out.println("///////////////////");
  } 
  @OnTransition(source = "CONNECTED", target = "REGISTERING")
  public void register() {
    System.out.println("///////////////////");
    System.out.println("注冊事件, 已連接 -> 注冊中");
    System.out.println("///////////////////");
  } 
  @OnTransition(source = "REGISTERING", target = "REGISTERED")
  public void registerSuccess() {
    System.out.println("///////////////////");
    System.out.println("注冊成功事件, 注冊中 -> 已注冊");
    System.out.println("///////////////////");
  } 
  @OnTransition(source = "REGISTERED", target = "UNCONNECTED")
  public void unRegister() {
    System.out.println("///////////////////");
    System.out.println("注銷事件, 已注冊 -> 未連接");
    System.out.println("///////////////////");
  }
}

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

總結(jié)

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

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

  • 定義狀態(tài)枚舉。

  • 定義事件枚舉。

  • 定義狀態(tài)機配置,設(shè)置初始狀態(tài),以及狀態(tài)與事件之間的關(guān)系。

  • 定義狀態(tài)監(jiān)聽器,當(dāng)狀態(tài)變更時,觸發(fā)方法。

到此,相信大家對“Spring中StateMachine狀態(tài)機的機制原理”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章標(biāo)題:Spring中StateMachine狀態(tài)機的機制原理
文章路徑:http://m.kartarina.com/article34/pihjse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計網(wǎng)站內(nèi)鏈網(wǎng)站維護品牌網(wǎng)站制作網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
主站蜘蛛池模板: 久久久无码精品亚洲日韩蜜桃| 50岁人妻丰满熟妇αv无码区| 亚洲日韩一区二区一无码| 亚洲一区无码中文字幕乱码| 日韩精品无码成人专区| 亚洲中文字幕久久精品无码喷水| 亚洲国产精品无码久久九九大片 | 无码av专区丝袜专区| 免费一区二区无码东京热| 亚洲精品无码专区在线| 无码人妻久久久一区二区三区| 国产精品无码久久久久| 午夜麻豆国产精品无码| 亚洲AV色吊丝无码| 无码人妻一区二区三区在线视频| 国产成人无码a区在线观看视频免费| 久久精品亚洲中文字幕无码麻豆 | 色综合久久久无码中文字幕| 亚洲精品午夜无码电影网| 热の无码热の有码热の综合| 亚洲精品GV天堂无码男同| 亚洲看片无码在线视频| 欧洲无码一区二区三区在线观看| 高清无码视频直接看| 潮喷大喷水系列无码久久精品 | 久久久国产精品无码一区二区三区| 日韩国产成人无码av毛片| 亚洲va无码va在线va天堂| 亚洲中文字幕无码日韩| 变态SM天堂无码专区| 亚洲精品无码av天堂| 国产精品成人99一区无码| 青春草无码精品视频在线观| 亚洲av无码成人精品区| 日韩精品无码永久免费网站| 精品无码久久久久久久动漫 | 久久久久琪琪去精品色无码| 久久久久无码国产精品一区 | 99久无码中文字幕一本久道| 亚洲中文字幕无码久久| 国产莉萝无码AV在线播放|