17. Using Guards
上面的guard1和guard2 beans分别附加到状态的入口和出口。
@Override
public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
throws Exception {
transitions
.withExternal()
.source(States.SI).target(States.S1)
.event(Events.E1)
.guard(guard1())
.and()
.withExternal()
.source(States.S1).target(States.S2)
.event(Events.E1)
.guard(guard2())
.and()
.withExternal()
.source(States.S2).target(States.S3)
.event(Events.E2)
.guardExpression("extendedState.variables.get('myvar')");
}
您可以直接将Guard实现为一个匿名函数,或者创建一个您自己的实现并将相应的实现定义为一个bean。 在上面的示例中,guardExpression只是简单地检查扩展状态变量myvar的值是否为TRUE。
@Bean
public Guard<States, Events> guard1() {
return new Guard<States, Events>() {
@Override
public boolean evaluate(StateContext<States, Events> context) {
return true;
}
};
}
@Bean
public BaseGuard guard2() {
return new BaseGuard();
}
public class BaseGuard implements Guard<States, Events> {
@Override
public boolean evaluate(StateContext<States, Events> context) {
return false;
}
}
StateContext在第19章使用StateContext中进行了介绍。
17.1 SpEL Expressions with Guards
也可以使用SpEL表达式替代完整的Guard实现。 唯一的要求是表达式需要返回一个布尔值来满足Guard实现。 这通过一个将表达式作为参数的guardExpression()函数来演示。