0

メッセージ コードに応じて新しいメッセージ ハンドラー インスタンスを返すインスタンス ファクトリを実装する必要があります。

インターフェース MessageHandler と、このインターフェースの約 50 の実装があります。プロジェクト構造 (maven の循環依存関係...) のため、ファクトリ クラスには具体的なインターフェイスの実装への依存関係がありません。

messageHandler インターフェース:

interface MessageHandler {
    void receive(Message message);

    MessageCode getMessageCode();
}

すべての MessageHandler 実装は、一意のメッセージ コードを返します。例えば:

class FirstMessageHandler implements MessageHandler {
     ...
     @Override
     MessageCode getMessageCode(){
          return MessageCodes.MESSAGE_TYPE_ONE;
     }
     ...
}

class SecondMessageHandler implements MessageHandler {
     ...
     @Override
     MessageCode getMessageCode(){
          return MessageCodes.MESSAGE_TYPE_TWO;
     }
     ...
}

MessageHandlerFactory は、メッセージごとに新しいハンドラー インスタンスを作成する必要があります。ファクトリには具体的な実装に関する情報がなく、実装の Maven パッケージへの依存関係はありません。messageCodes のみが含まれます。

class MessagehandlerFactory {
       MessageHandler createHandler(MessageCode messageCode){
       ...
       }
}

検索した後、 @Produce アノテーションとこの素敵な例に関する例を見つけました:

http://docs.oracle.com/javaee/6/tutorial/doc/gkgkv.html

しかし、この例では、ファクトリ内のすべての実装タイプを知る必要があり、これは許可されていません。

実際の解決策は、@Any @Instance を使用することです。

 @Inject
 @Any
 private Instance<MessageHandler> messageHandlers;

@PostConstruct
public void init() {
    for (MessageHandler handler : messageHandlers) {
        messageHandlerMap.put(handler.getMessageCodes(), handler);
    }
}

ただし、このコードは、受信したすべてのメッセージに対してすべての MessageHandler 実装のすべてのメッセージ インスタンスを作成します。@Produce と @Qualifier を組み合わせて、受信した MessageCode に応じて 1 つの MessageHandler インスタンスのみが作成されるようにすることは可能ですか?

Glassfish 3.1.2.2 を使用しています。

4

2 に答える 2

2

を観察することで、移植可能な拡張機能のすべてのインスタンスを取得できますProcessAnnotatedType。それらを別のクラスまたはリスナークラスの静的コレクションに保存すると、クラスを注入することでこれらすべてのインスタンスを取得できます。

別のオプションは、 をプロデューサー メソッドに挿入し、そこにある情報を使用して、トラバーサルInjectionPoint中に必要なインスタンスを返すことです。Instanceただし、これは依存スコープのインジェクションに対してのみ機能することに注意してください。

于 2013-01-22T14:38:49.610 に答える
0

あなたの機能要件を理解しているのかわかりません。

プロデューサーパターンは間違った選択のように聞こえますが、何をプロデュースするかわからない場合は、なぜそれを使用するのですか?

私はコードが実際に何をするかについては従いませんが、インターフェースを持って実装を行うだけで何が悪いのかを尋ねさせてください。

新しい実装はすべて独自の修飾子を取得し、コンテキストインスタンスは@Inject@QualifierNameを使用して取得できます。

理由もなく複雑なことをしているのではないかと思いますが、よくわからないのでわかりません:-)

于 2013-01-21T18:43:06.683 に答える