1. ホーム
  2. java

EJB 3.1 @LocalBeanとアノテーションなしの比較

2023-08-14 09:13:01

質問

ローカル ビュー、リモート ビュー、および非インターフェイス ビューの違いは理解しています。ただ、quot;no view" (注釈なし) と no-interface view の違いは何なのかがわかりません。また、なぜ私のインターフェイスに @Local ? インターフェイスに全く注釈を付けない場合はどうなるのでしょうか?

どのように解決するのですか?

ルールは(記憶では)です。

  1. ビーンには @LocalBean アノテーション -> Beanはノーインターフェイスビューを持ちます。
  2. ビーンには @Local アノテーション -> Beanはローカルビューを持ちます。
  3. ビーンには @Remote アノテーション -> Beanはリモートビューを持ちます。
  4. Beanはビューアノテーションを持たないが、@Localアノテーションを持つインターフェースを直接実装している -> Beanはローカルビューを持つ
  5. Beanはビューアノテーションを持たないが、@Remoteアノテーションを持つインターフェースを直接実装する ->beanはリモートビューを持つ
  6. Beanはビューアノテーションを持たないが、ビューアノテーションを持たないインタフェースを直接実装する -> beanはローカルビューを持つ
  7. Beanはビューアノテーションを持たず、インターフェースを実装しない -> Beanはインターフェースなしのビューを持つ

そこで @LocalBean を使うのも、アノテーションを全く使わないのも、どちらもノーインターフェイス・ビューを得るための方法です。もし、インターフェイスなしのビューが欲しいだけなら、アノテーションを付けないのが一番シンプルな方法です。ただし、インターフェースも実装していないことが条件です。

理由の一部 @LocalBean が存在する理由のひとつは、インターフェイス ビューを持つ Bean にインターフェイスなしのビューを追加するためです。仕様作成者の頭の中で最も上位にあったシナリオは、次のようなビーンを持っているものだったと想像しています。

@Stateless
public class UserPreferences {
    public String getPreference(String preferenceName);
    public Map<String, String> getPreferences();
}

両方のメソッドをローカルに公開したいが、より粗い粒度の getPreferences() をリモートで公開したい場合です。そのためには、そのメソッドだけを持つリモートインターフェイスを宣言し、 そのインターフェイスに @LocalBean をビーンクラスに追加するだけです。これがなければ、両方のメソッドをローカルに公開するために、無意味なローカルインターフェースを書かなければならないでしょう。

あるいは、別の見方をすれば、ビーンクラスにある @LocalBean が存在するのは、ノーインターフェイスビューというものが存在するからであり、ノーアノテーションオプションは便利なショートカットとして存在するのです。