0

クライアントインターフェイスを実装するクライアントを開始することを目的とする messageListener があります。クライアント インターフェイスのさまざまな実装は、コンパイル時にはわかりません。

messageListener は Launcher-bean を使用してクライアントを起動します。したがって、私の問題は、クライアント インターフェイスの選択された実装が注入されたランチャー Bean を構築する必要があることです。これを行う方法がわからない、または問題を別の方法でアプローチする必要がありますか?

public class MyMessageConsumer implements MessageListener {
    public void onMessage(Message message) {
        String clientType = message.getClientType();

        //Here i need to construct a launcher-bean, which has the correct Client-implementation injected

        launcher.startClient(message);
    }   
}

public class Launcher {

    @Inject
    private Client client;

    public void startClient(Message message) {
        ...

        client.start(message);
    }

}

編集:トリッキーな部分は正しい実装を見つけていないことに気付きましたが、メッセージの消費を新しいリクエストとして行う必要があることに気付きました。何を求めているのか理解できますか?

4

1 に答える 1

0

あなたが望むのはプロデューサーです。

このようにして、コンテキスト インスタンスのクライアントとプロデューサーを分離します。したがって、それらをプロデューサーに注入し、何を使用するかを決定させます。

これを透過的にし、あいまいな依存関係を回避するには、@Dynamic 修飾子を使用して値を生成できます。

@Inject
@Dynamic
Foo foo;

................................................

@Produces
@Dynamic
public Foo getFoo() {
//find out what implementation to use and return it  

独自の修飾子とプロデューサーを作成するのは、Google で検索するのが非常に簡単です。

于 2012-12-07T18:19:56.457 に答える