web-dev-qa-db-ja.com

@Statefulまたは@Statelessアノテーションを追加すると、実際には何が行われますか?

Java EE。クラスに@Statefulまたは@Statelessアノテーションを追加するとEJBBeanになることはわかっています。しかし実際には何ですか。これを実行すると、バックグラウンドで発生しますか?EJBに関連してウィキペディアに次のリストが表示されます。

  • トランザクション処理
  • Java Persistence API(JPA)によって提供される永続性サービスとの統合
  • 同時実行制御
  • JavaメッセージサービスおよびJava EEコネクタアーキテクチャを使用したイベント
  • 非同期メソッドの呼び出し

  1. クラスをEJBとしてマークすると、上記のアイテムはバックグラウンドで「処理」されますか?クラスをEJBにすると、上記のそれぞれを通過するまったく異なるコードパスがたどられますが、それは何が起こっているのでしょうか。
  2. CDIを使用すると、CDIBeanの代わりにEJBBeanを注入するオプションがあることがわかります。その場合、EJB BeanはCDI Beanよりも強力なので、常にCDIBeanではなくEJBBeanを使用する必要がありますか?
14
sonicboom

両方の質問に関する洞察については、 この回答 を参照してください。

その答えで焦点を当てるべきハイライトは次のとおりです。

  • EJBとCDIBeanはプロキシされたコンポーネントであり、取得するオブジェクトは偽物であり、実際のオブジェクトは非表示であり、これがサービスの追加方法です:caller-> proxy-> services-> realObject
  • CDIとEJBは事実上同じであり、自由に組み合わせることができます。どちらを使用するかは、何をしようとしているかによって異なります。その回答に記載されている項目のいずれかが必要でない限り、私はCDIを使用する傾向があります。次に、新しいBeanをアップグレードまたは追加するだけです。

その答えで私が見逃したことの1つは、@MessageDrivenの概念全体でした。

MessageDriven Beans

JMS /コネクタを同じ行に配置するのは非常に興味深いことです。それは、まさにそれらの実装方法です。メッセージ駆動型Bean(MDB)は、実際には「コネクタ駆動型Bean」と呼ばれる必要があります。これは、MDBのすべての通信とライフサイクルが実際にはコネクタアーキテクチャ仕様に関連付けられており、JMSとは直接関係がないためです。JMSはコネクタの唯一の人です。今まで見たことがあります。 そこには大きな可能性があります 。うまくいけば、Java EE7でいくつかの改善が見られるでしょう。

5
David Blevins