5

CDIがどのように機能するかを理解したと思います.CDIを深く掘り下げるために、実際の例で使用してみたいと思います. 理解してもらうためにあなたの助けが必要なことが 1 つあります。この点であなたの助けに本当に感謝します.

Java リフレクション API と XML 構成を使用して独自のワークフロー フレームワークを開発しました。特定のタイプの「ソース」と「イベント名」に基づいて、適切なモジュール クラスをロードし、その上で「プロセス」メソッドを呼び出します。私たちのプロジェクトでは、すべてがうまく機能しています。

私はCDI機能に興奮し、リフレクションなどを使用してそれらをロードする代わりにモジュールクラスを注入することを計画しているワークフローフレームワークで試してみたいと思いました...

ここでは簡単に説明します。

「Message.java」は、モジュールを適切にロードできるように、「Source」と「eventName」を運ぶ転送オブジェクトの一種です。

public class Message{
private String source;
private String eventName;
}

モジュール構成は以下の通り

<modules>
<module>
    <source>A</source>
    <eventName>validate</eventName>
    <moduleClass>ValidatorModule</moduleClass>
</module>
<module>
    <source>B</source>
    <eventName>generate</eventName>
    <moduleClass>GeneratorModule</moduleClass>
</module>
</modules>

ModuleLoader.java

public class ModuleLoader {
public void loadAndProcess(Message message){
    String source=message.getSource();
    String eventName=message.getEventName();

    //Load Module based on above values.

}
}

質問

ここで、CDI を介して同じものを実装してモジュールを (ModuleLoader クラスに) 挿入したい場合は、@Produce メソッドを使用して Factory クラスを記述できます。しかし、私の質問は、

a) Message オブジェクトを @Produce メソッドに渡して、 eventName と source に基づいてルックアップを行うにはどうすればよいですか?

提案をお願いできますか?

前もって感謝します。

4

3 に答える 3

4

CDIはカスタムソリューションと同じようには機能しないため、これは少し注意が必要です(私が正しく理解している場合)。CDIには、起動時に依存関係とそれらの依存関係の解決策のすべてのリストが必要です。ソリューションは、実行時に変更される可能性のあるすべてのものを検出するように聞こえます。そうは言っても、試すことができることがいくつかあります。

InjectionPointをパラメーターとしてプロデューサーメソッドに挿入して正しいオブジェクトを返すか、正しいタイプを作成してみてください。

これを行う独自の拡張機能を作成し、依存関係を作成して、それらすべてを拡張機能に接続することもできます(、、、および'AfterBeanDiscovery`イベントを参照してくださいProcessInjectionTargetProcessAnnotatedTypeこれらの2つの クイックスタートは、いくつかのアイデアを実現するのにも役立ちます。

于 2012-12-30T21:38:59.810 に答える
4

プロデューサーに関しては、間違った道を進んでいる可能性があると思います。代わりに、特にあなたが説明したことに基づいて、オブザーバーを使用する方がはるかに優れているでしょう。

「メッセージ」転送オブジェクトは、基本的にイベントを発生させるシステム全体のイベントのように抽象的に使用され、イベントの正しいマネージャーを決定するために作成した XML フレームワークで定義されたハンドラーが必要であると想定しています。 、それをインスタンス化し(必要な場合)、イベントを渡すクラスを呼び出します。


@ApplicationScoped 
public class MyMessageObserver {

    public void handleMessageEvent(@Observes Message message) {
        //Load Module based on above values and process the event
    }
}

ここで、元のインターフェイスを利用したいと仮定しましょう (次のようになると思います)。


public interface IMessageHandler {
     public void handleMessage(final Message message);
}

@ApplicationScoped
public class EventMessageHandler implements IMessageHandler {

    @Inject
    private Event<Message> messageEvent;

    public void handleMessage(Message message) {
        messageEvent.fire(message);
    }
}

次に、それを使用したいレガシークラスで: @Inject IMessageHandler handler;

これにより、説明したすべてのことを実行できます。

于 2013-06-18T03:04:34.610 に答える