6

私は春が初めてなので、プレーンJavaを使用して状態パターンをSpring DIに変換する際に問題に直面しています。

実際には状態パターンを使ってプロジェクトを作成しましたが、すべての状態がコンテキスト クラスではなく、連続した状態を認識しているというアプローチを取りました。

コンテキスト クラスにはフィールド「currentState」があり、その型は IState であり、メソッド setState(IState state) があります。

IState には 1 つのメソッド geNext(Context context) があります。

そして、コンテキスト クラスで while(keepOn) keepOn を true にし、ExitState で false になって処理を停止し、このループで currentState.goNext() を呼び出します。

各状態はいくつかのデータベース トランザクションと Web サービスの呼び出しを行い、結果に応じて context.setState(new StateFour()) を使用して次の状態を設定します。

最初の状態は、コンテキストの作成後にクライアントによって設定されます。

コードサンプル:

public interface IState{public void goNext(Context context);}

public class StateOne implements IState{
      public void goNext(Context context){
          //do some logic
          if(user.getTitle.equals("manager"){context.setState(new StateThree());}
          else if(user.getTitle.equals("teamLead"){context.setState(new StateTwo());}
          else{context.setState(new ExitState());}
      }
}

public class Context{
   private boolean keepOn = true;
   private IState currentState;
   public void setState(IState state){
      currentState = state; 
   }
   while(keepOn){currentState.goNext(this);}
}

今、私はSpring DI注釈ベースを使用しようとしています.私が直面している問題は、コンテキストが@Autowiredで「currentStateフィールド」に注釈を付けることですが、私が状態1にあり、「if statement" success 状態 3 を注入する "else if" 状態 2 を注入するそれ以外の場合は exitState を注入します。

@Qualifier(value ="stateOne") を使用すると、インターフェイスを実装する最初の状態のみが指定されますが、状況に応じて設定した他の状態は春に指定する方法がわかりません。

また、org.springframework.core.Ordered は事前に Bean の順序を指定する必要がありますが、事前にデータベースまたは Web サービスから受け取る値がわからないため、実行時に指定する必要があります。

このプレーンなJavaをSpring DIに置き換えることは可能ですか?

ご協力いただきありがとうございます。長くなって申し訳ありません。

4

2 に答える 2

1

ApplicationContextを使用する必要があります。以下の例:

// Inject application context into your bean
@Autowired
ApplicationContext applicationContext;

// Get bean from the context (equivalent to @Autowired)
applicationContext.getBean(StateThree.class);
于 2014-07-23T12:32:48.323 に答える
0

状態を自動配線する最も用途の広い方法は、解決可能な依存関係をConfigurableListableBeanFactory. org.springframework.beans.factory.ObjectFactory<T>依存関係として、現在のユーザーを取得し、注入する状態を作成/フェッチする実装をドロップできます。

これはまさに、たとえば type のフィールドを自動配線したときに起こることですHttpServletRequest。ARequestObjectFactoryは現在のリクエストを取得し、この実装を使用してそれを注入します。

// org.springframework.web.context.support.WebApplicationContextUtils

private static class RequestObjectFactory implements ObjectFactory<ServletRequest>, Serializable {

    @Override
    public ServletRequest getObject() {
        return currentRequestAttributes().getRequest();
    }

    @Override
    public String toString() {
        return "Current HttpServletRequest";
    }
}
于 2014-08-01T13:28:37.553 に答える