参考文档连接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应用程序上下文事件,要么直接将侦听器附加到状态机。这些基本上都会提供相同的信息,其中一个经过监听器接口将事件生成为事件类和其余生成回调。这二者都有优势和缺点,将在稍后讨论。_