16. Using Actions
从用户角度来看,操作是最有用的组件之一,可以与状态机进行交互和协作。 动作可以在状态机的不同位置及其状态生命周期中执行,例如进入或退出状态或转换期间。
@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 bean分别附加到状态的入口和出口。
@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发送到状态机。
StateContext在第19章使用StateContext中进行了介绍。
16.1 SpEL Expressions with Actions
也可以使用SpEL表达式替代完整的Action实现。