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()函数来演示。

results matching ""

    No results matching ""