web-dev-qa-db-ja.com

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

ローカルビュー、リモートビュー、インターフェイスなしのビューの違いを理解しています。 「ビューなし」(注釈なし)とインターフェイスなしのビューの違いを理解できません。また、なぜ@Localでインターフェイスに注釈を付ける必要があるのですか?インターフェイスにまったく注釈を付けない場合、違いはありますか?

73
VaclavDedik

ルールは(メモリから)です。

  1. Beanには_@LocalBean_注釈があります-> Beanにはインターフェースなしのビューがあります
  2. Beanには_@Local_注釈があります-> Beanにはローカルビューがあります
  3. Beanには_@Remote_注釈があります-> Beanにはリモートビューがあります
  4. Beanにはビューアノテーションはありませんが、@ Localアノテーションを持つインターフェースを直接実装します-> Beanにはローカルビューがあります
  5. Beanにはビューアノテーションはありませんが、@ Remoteアノテーションを持つインターフェースを直接実装します-> Beanにはリモートビューがあります
  6. Beanにはビューアノテーションはありませんが、ビューアノテーションがないインターフェースを直接実装します-> Beanにはローカルビューがあります
  7. Beanにはビュー注釈がなく、インターフェースも実装していません-> Beanにはインターフェースなしのビューがあります

したがって、_@LocalBean_を使用し、注釈をまったく使用しないことは、どちらもインターフェースなしのビューを取得する方法です。インターフェイスなしのビューだけが必要な場合、最も簡単なことは注釈を付けないことです。インターフェイスも実装していない場合。

インターフェースビューのないBeanにインターフェースなしのビューを追加する理由は、_@LocalBean_の一部です。仕様の作者の頭の中で一番上のシナリオは、あなたが次のようなBeanを持っているシナリオだと思います。

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

両方のメソッドをローカルで公開したいが、粗いgetPreferences()のみをリモートで公開したい場合。そのためには、そのメソッドだけでリモートインターフェイスを宣言してから、Beanクラスで_@LocalBean_をスラップするだけです。それがなければ、両方のメソッドをローカルで公開するためだけに、意味のないローカルインターフェイスを記述する必要があります。

または、別の方法で見ると、_@LocalBean_が存在します。これは、インターフェイスなしのビューなどがあり、注釈なしオプションが便利なショートカットとして存在するためです。

133
Tom Anderson
  • リモートEJB:リモートクライアント(ユーザーマシンで実行されるSwingやJavaFXクライアントなどの異なるJVMで実行されているクライアント)からアクセスできます。
  • ローカルEJB:同じJVM上で実行されている他の「コンポーネント」からのみアクセスできます。 Webフロントエンド、他のEJB
  • インターフェースなしビュー:ローカルと同じですが、ビジネスインターフェースを指定しません
  • 注釈なし:EJBではなく、単純なPOJO

ローカル/インターフェイスなしのビューは、オブジェクト参照を渡すことができるため、リモートEJBよりも効率的です。

15
Puce

あなた/私たちが感じている混乱は、歴史/後方互換性(いわば)の結果だと思います。違いを見分けることはできません(ローカルビューを使用する場合、仕様ではインターフェイスを作成する実装が必要です)

No-interfaceビューは、EJB 3.0ローカルビューと同じ動作をします。たとえば、参照渡しの呼び出しセマンティクス、トランザクションおよびセキュリティの伝播などの機能をサポートします。ただし、インターフェイスなしのビューでは、個別のインターフェイスは必要ありません。つまり、Beanクラスのすべてのパブリックメソッドは自動的に呼び出し元に公開されます。デフォルトでは、空のimplements句があり、他のローカルまたはリモートクライアントビューを定義しないセッションBeanは、インターフェイスなしのクライアントビューを公開します。

EJB 3.1リリース前のOracleブログ

6
esej

より技術的な詳細に興味がある場合は、実際に何が起こっているのかを教えてください。EJBオブジェクトに直接アクセスすることはできません。実際のEJBオブジェクトの参照(アドレス)がないことを意味します。 EJBをルックアップまたはインジェクトすると、コンテナはそのEJBのクライアントとしてオブジェクトを提供し(プロキシまたはラッパーを呼び出すことができます)、そのプロキシオブジェクトでビジネスメソッドを呼び出します。 (だからこそ、EJBクラスのオブジェクトを作成するために新しいキーワードを使用すべきではありません)

現在、コンテナは注釈のタイプごとに、さまざまなメソッドと機能を持つさまざまなタイプのプロキシを生成します。

_@LocalBean_(または注釈なし)プロキシオブジェクトには次のものがあります。

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

_@Local_プロキシオブジェクトはローカル呼び出しと__com.Sun.proxy_のタイプを使用します。

  • getSerializableObjectFactory()
  • isProxyClass()
  • getProxyClass()
  • getInvocationHandler()
  • newProxyInstance()

_@Remote_ Wrapperオブジェクトはリモート呼び出しを使用します。

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()
0
A. Parvini