0

我在库中提供了一个带有基本程序状态的 Spring 状态机,作为不同实现的基础。由于提供了转换注释,因此使用基本状态机根据当前实现添加自定义转换操作似乎很容易

现在我想对守卫做一些类似的事情,即根据使用基本状态机的实现中最近的使用场景提供一个转换守卫

一个想法是在实现装饰器模式的基本状态机中配置一个默认守卫,即它是一个包装器,实现了包裹在另一个守卫周围的守卫接口。作为默认保护包装,使用了一个简单的保护实现,它总是为评估方法返回 true。

代码片段看起来像......首先是警卫:

import org.springframework.statemachine.StateContext;
import org.springframework.statemachine.guard.Guard;
// ... custom States and Events imports

public class GuardDecorator implements Guard<States, Events> {

    private Guard<States, Events> guard;

    public GuardDecorator() {
        this.guard = new DefaultGuard();
    }

    public GuardDecorator(Guard<States, Events> guard) {
        this.guard = guard;
    }

    public void setGuard(Guard<States, Events> guard) {
        this.guard = guard;
    }

    public String wrappedGuardInfo() {
        return this.guard.toString();
    }

    @Override
    public boolean evaluate(StateContext<States, Events> context) {
        return this.guard.evaluate(context);
    }
}

public class DefaultGuard implements Guard<States, Events> {
    @Override
    public boolean evaluate(StateContext<States, Events> context) {
        return true;
    }
}

现在在状态机配置器中使用 GuardDecorator(仅摘录):

// ...
@Bean
public GuardDecorator guard() {
    return new GuardDecorator();
}
// ...
@Override
public void configure(
    StateMachineTransitionConfigurer<States, Events> transitions)
    throws Exception {

    transitions.withExternal()
        .source(States.S1)
        .target(States.S2)
        .event(Events.E1)
        .guard(guard());
    }
// ...

我现在的问题是:

  • 我是否遗漏了文档中的某些内容,是否有内置方法可以做到这一点
  • 任何其他解决方案来获得库中提供的基本状态机的实现依赖保护?
4

1 回答 1

1

没有内置的,但不确定是否必须有。如果您基于 JavaConfig 进行此配置,您可以在那里创建默认保护并允许用户自动装配可选的覆盖实现

Autowired(required=false)
@Qualifier("myGuard")
Guard<States, Events> guard;

或者允许用户覆盖 bean 定义本身。如果在多个配置类中创建了相同的 bean,则按顺序最新解决的优先。这个概念在 Spring Umbrella 项目中大量使用,默认 bean 存在但允许被用户覆盖。

@Bean(name="myGuard")
public GuardDecorator guard() {
    return new GuardDecorator();
}
于 2016-07-17T06:19:07.743 回答