ローカルビュー、リモートビュー、インターフェイスなしのビューの違いを理解しています。 「ビューなし」(注釈なし)とインターフェイスなしのビューの違いを理解できません。また、なぜ@Local
でインターフェイスに注釈を付ける必要があるのですか?インターフェイスにまったく注釈を付けない場合、違いはありますか?
ルールは(メモリから)です。
@LocalBean
_注釈があります-> Beanにはインターフェースなしのビューがあります@Local
_注釈があります-> Beanにはローカルビューがあります@Remote
_注釈があります-> Beanにはリモートビューがありますしたがって、_@LocalBean
_を使用し、注釈をまったく使用しないことは、どちらもインターフェースなしのビューを取得する方法です。インターフェイスなしのビューだけが必要な場合、最も簡単なことは注釈を付けないことです。インターフェイスも実装していない場合。
インターフェースビューのないBeanにインターフェースなしのビューを追加する理由は、_@LocalBean
_の一部です。仕様の作者の頭の中で一番上のシナリオは、あなたが次のようなBeanを持っているシナリオだと思います。
_@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map<String, String> getPreferences();
}
_
両方のメソッドをローカルで公開したいが、粗いgetPreferences()
のみをリモートで公開したい場合。そのためには、そのメソッドだけでリモートインターフェイスを宣言してから、Beanクラスで_@LocalBean
_をスラップするだけです。それがなければ、両方のメソッドをローカルで公開するためだけに、意味のないローカルインターフェイスを記述する必要があります。
または、別の方法で見ると、_@LocalBean
_が存在します。これは、インターフェイスなしのビューなどがあり、注釈なしオプションが便利なショートカットとして存在するためです。
ローカル/インターフェイスなしのビューは、オブジェクト参照を渡すことができるため、リモートEJBよりも効率的です。
あなた/私たちが感じている混乱は、歴史/後方互換性(いわば)の結果だと思います。違いを見分けることはできません(ローカルビューを使用する場合、仕様ではインターフェイスを作成する実装が必要です)
No-interfaceビューは、EJB 3.0ローカルビューと同じ動作をします。たとえば、参照渡しの呼び出しセマンティクス、トランザクションおよびセキュリティの伝播などの機能をサポートします。ただし、インターフェイスなしのビューでは、個別のインターフェイスは必要ありません。つまり、Beanクラスのすべてのパブリックメソッドは自動的に呼び出し元に公開されます。デフォルトでは、空のimplements句があり、他のローカルまたはリモートクライアントビューを定義しないセッションBeanは、インターフェイスなしのクライアントビューを公開します。
より技術的な詳細に興味がある場合は、実際に何が起こっているのかを教えてください。EJBオブジェクトに直接アクセスすることはできません。実際のEJBオブジェクトの参照(アドレス)がないことを意味します。 EJBをルックアップまたはインジェクトすると、コンテナはそのEJBのクライアントとしてオブジェクトを提供し(プロキシまたはラッパーを呼び出すことができます)、そのプロキシオブジェクトでビジネスメソッドを呼び出します。 (だからこそ、EJBクラスのオブジェクトを作成するために新しいキーワードを使用すべきではありません)
現在、コンテナは注釈のタイプごとに、さまざまなメソッドと機能を持つさまざまなタイプのプロキシを生成します。
_@LocalBean
_(または注釈なし)プロキシオブジェクトには次のものがあります。
setOptionalLocalIntfProxy()
getSerializableObjectFactory()
_@Local
_プロキシオブジェクトはローカル呼び出しと__com.Sun.proxy
_のタイプを使用します。
getSerializableObjectFactory()
isProxyClass()
getProxyClass()
getInvocationHandler()
newProxyInstance()
_@Remote
_ Wrapperオブジェクトはリモート呼び出しを使用します。
readResolve()
writeReplace()
getStub()
getBusinessInterfaceName()