2

EJB3を使って次のことができるのではないかと思います。

私は次のインターフェースを持っています:

interface DateParser {
    Date parseDate(String input);
    String getType();
}

次に、getTypeメソッドで指定された情報に基づいてさまざまな形式を処理する、前述のインターフェイスのいくつかの実装があります。Beanが起動すると、DateParserの実装のセットが作成され、日付を解析する必要がある場合は、セットを反復処理して、どれが一致するかを確認します。一致する場合は、その1つを使用して日付を解析します。一致するものがない場合は、デフォルトの戦略が適用されます。新しい戦略を追加するたびにBeanのコードを変更する必要があり、それが非常に混乱するため、これらのデリゲートのインスタンス化を避けたいと思います。

コンテナーに、デプロイメント時に検出されたすべての実装を注入してもらいたいと思います。これを達成するための合理的な方法はありますか?

ありがとう

4

3 に答える 3

1

このインターフェースの実装は、Beanではなく通常のクラスである必要があります。EJBはビジネスサービスを目的としています。解析日は、豆にはきめが細かすぎる私見の責任です。

コンテナーに、デプロイメント時に検出されたすべての実装を注入してもらいたいと思います。

それを行うための標準的な方法はないと思います。セットをインスタンスで動的に埋めるオプションは2つしかありません。

  1. クラス名のリストを含む外部構成ファイルを使用します。各クラス名に到達し、1つのインスタンスをリフレクティブにインスタンス化します(Class.forNameClass.newInstance)。次に、それをセットに追加します。

  2. クラスパス内のすべてのクラスを反復処理し、の実装であるクラスを特定しますDateParser。次に、それを反射的にインスタンス化し、セットに追加します。ロード可能なクラスを反復処理するのはちょっと難しいことに注意してください。この回答を参照してください。

Beanのコードを変更する必要があるため、非常に混乱します。

これには、クラスのコード変更が必要ですが、Bean自体は必要ありません。Beanは、セットの作成、パーサーの識別などを別のクラスIMHOに委任する必要があります。

于 2012-08-16T11:22:31.427 に答える
0

はい、できます。このサンプルをご覧ください。

    @EJB(beanName = "yourSessionEJB")
    DateParser dateParser;

他のセッションBean名をbeanName属性に変更できます。ただし、1つのセッションBeanを使用する1つのローカルインターフェイスをお勧めします。混乱しないでください。

于 2012-08-16T05:28:20.930 に答える
0

いくつかのインターフェースのすべての実装を取得したい場合は、インスタンスインターフェースで@Anyアノテーションを使用できます。

これを見てください:https ://goo.gl/Kbn0bP

于 2016-03-15T23:11:07.510 に答える