參考文檔連接html
從用戶角度來看,操做是最有用的組件之一,能夠與狀態機進行交互和協做。動做能夠在狀態機的不一樣位置及其狀態生命週期中執行,例如進入或退出狀態或轉換期間。spring
@Override public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception { states .withStates() .initial(States.SI) .state(States.S1, action1(), action2()) .state(States.S2, action1(), action2()) .state(States.S3, action1(), action3()); }
上面
action1
和action2
beans分別附加到狀態的入口和出口。express
@Bean public Action<States, Events> action1() { return new Action<States, Events>() { @Override public void execute(StateContext<States, Events> context) { } }; } @Bean public BaseAction action2() { return new BaseAction(); } @Bean public SpelAction action3() { ExpressionParser parser = new SpelExpressionParser(); return new SpelAction( parser.parseExpression( "stateMachine.sendEvent(T(org.springframework.statemachine.docs.Events).E1)")); } public class BaseAction implements Action<States, Events> { @Override public void execute(StateContext<States, Events> context) { } } public class SpelAction extends SpelExpressionAction<States, Events> { public SpelAction(Expression expression) { super(expression); } }
你能夠直接將Action實現爲匿名函數,或者建立本身的實現並將相應的實現定義爲bean。 在action3中,SpEL表達式用於將事件Events.E1發送到狀態機。ide
StateContext在處理狀態機時是最重要的對象之一,由於它被傳遞到各類方法和回調中,以給出狀態機的當前狀態以及它可能發生的狀況。若是簡化一點,它能夠被認爲是 StateContext傳遞的當前狀態機階段的快照。函數
** _ 在Spring Statemachine 1.0.x
StateContext中,使用它的方式比較簡單,就如何將它用做簡單的東西而言POJO。_ **調試
** 從開始Spring Statemachine 1.1.x
它的做用已經使其成爲一個狀態機中的頭等公民有了很大的提升 。 **日誌
在總體StateContext中能夠用做。code
StateContext被傳入與用戶likeAction和進行交互的各類組件Guard。htm
_ Stage 是stage狀態機當前正在與用戶交互的一個表示。目前的階段是EVENT_NOT_ACCEPTED,EXTENDED_STATE_CHANGED, STATE_CHANGED,STATE_ENTRY,STATE_EXIT,STATEMACHINE_ERROR, STATEMACHINE_START,STATEMACHINE_STOP,TRANSITION, TRANSITION_START和TRANSITION_END它看起來像那些比賽如何用戶能夠與聽衆中描述互動很是熟悉 ,有一些用例只是想知道狀態機發生了什麼,對某些事情作出反應或僅僅爲了調試目的而進行日誌記錄。SSM提供了用於添加偵聽器的接口,而後在出現各類狀態更改,動做等時提供選項以得到回調。對象
你基本上有兩個選擇,要麼聆聽Spring應用程序上下文事件,要麼直接將偵聽器附加到狀態機。這些基本上都會提供相同的信息,其中一個經過監聽器接口將事件生成爲事件類和其餘生成回調。這二者都有優勢和缺點,將在稍後討論。_