0

さまざまな実装のベースとして、ライブラリ内の基本的なプログラム状態を持つ Spring ステートマシンを提供します。基本的なステートマシンを使用して現在の実装に応じてカスタム遷移アクションを追加することは、提供されている遷移注釈により簡単に思えます。

ここで、ガードで同様のことを行いたいと考えています。つまり、基本的な statemachine を使用して、実装内の最近の使用シナリオに応じて遷移ガードを提供します

1 つのアイデア、デコレータ パターンを実装する基本ステートマシン内にデフォルト ガードを設定することです。つまり、別のガードをラップするガード インターフェースを実装するラッパーです。デフォルトのガード ラップとして、evaluate メソッドに対して常に 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;
    }
}

statemachine 設定ツールで 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 が作成された場合、最後に解決されたものが優先されます。この概念は、デフォルト Bean が存在するがユーザーによるオーバーライドが許可されている Spring Umbrella プロジェクトで頻繁に使用されます。

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