現在、Java EEには複数のコンポーネントモデルがあるため、実際には少し混乱しています。それらは、CDI、EJB3、およびJSFマネージドBeanです。
CDIはブロックの新しい子供です。CDI Beanの機能dependency injection
、scoping
およびevent bus
。CDI Beanは、インジェクションとスコープに関して最も柔軟性があります。イベントバスは非常に軽量で、最も単純なWebアプリケーションにも非常に適しています。これに加えて、CDI portable extensions
はと呼ばれる非常に高度な機能も公開しています。これは、ベンダーがすべての実装(Glassfish、JBoss AS、Websphereなど)で利用できるようにするJava EEに追加機能を提供するプラグインメカニズムの一種です。 。
EJB3 Beanは、古いレガシーEJB2コンポーネントモデル*から改良されたものであり、Java EEで最初にアノテーションを介して管理されるBeanでした。EJB3 Beanが備わっていますdependency injection
、declarative transactions
、 declarative security
、pooling
、concurrency control
、asynchronous execution
とremoting
。
EJB3 Beanの依存性注入は、CDI Beanほど柔軟ではなく、EJB3 Beanにはスコープの概念がありません。ただし、EJB3 Beanはトランザクション対応であり、デフォルトで**にプールされます。これは、CDIがEJB3のドメインに残すために選択した2つの非常に使いやすいものです。その他の記載されている項目も、CDIでは使用できません。ただし、EJB3には独自のイベントバスはありませんが、メッセージをリスンするための特別なタイプのBeanがあります。メッセージ駆動型Bean。これは、JavaメッセージングシステムまたはJCAリソースアダプターを備えた他のシステムからメッセージを受信するために使用できます。単純なイベントに本格的なメッセージングを使用することは、CDIイベントバスよりもはるかに重く、EJB3はリスナーのみを定義し、プロデューサーAPIは定義しません。
JSFが含まれて以来、JSF管理BeanはJava EEに存在していました。彼らも機能dependency injection
していscoping
ます。JSFマネージドBeanは、宣言型スコープの概念を導入しました。元々、スコープはかなり制限されていたため、EJB3 Beanがすでにアノテーションを介して宣言されていた同じバージョンのJava EEでは、JSFマネージドBeanをXMLで宣言する必要がありました。JSFマネージドBeanの現在のバージョンも最終的に注釈を介して宣言され、スコープはビュースコープとカスタムスコープを作成する機能で拡張されます。同じページへのリクエスト間のデータを記憶するビュースコープは、JSFマネージドBeanのユニークな機能です。
ビュースコープは別として、Java EE 6でのJSFマネージドBeanはまだほとんどありません。CDIでビュースコープが不足しているのは残念です。更新:Java EE 7 / JSF 2.2では、CDI互換の@ViewScopedが追加され、CDIは確かにその完璧なスーパーセットになりました。Update 2:JSF2.3では、JSF管理対象Beanが廃止され、CDI管理対象Beanが採用されました。
EJB3とCDIでは、状況はそれほど明確ではありません。EJB3コンポーネントモデルとAPIは、CDIが提供しない多くのサービスを提供するため、通常、EJB3をCDIで置き換えることはできません。一方、CDIはEJB3と組み合わせて使用できます-たとえば、EJBへのスコープサポートの追加。
CanDIと呼ばれるCDI実装のエキスパートグループメンバーであり実装者であるReza Rahmanは、EJB3コンポーネントモデルに関連付けられたサービスをCDIアノテーションのセットとして改造できることを頻繁に示唆しています。そうなると、Java EEのすべての管理対象BeanがCDI Beanになる可能性があります。これは、EJB3が消えたり、時代遅れになったりすることを意味するのではなく、その機能が@Statelessや@EJBなどのEJB独自のアノテーションではなくCDIを介して公開されることを意味します。
更新
TomEEとOpenEJBの名声のDavid Blevinsが彼のブログでCDIとEJBの違いと類似点を非常によく説明しています:CDI、いつEJBを分解するか
*これはバージョン番号の増分にすぎませんが、EJB3 Beanは大部分が完全に異なる種類のBeanでした。単純な単一のアノテーションを適用することによって「管理対象Bean」になる単純なpojoと、重量があり、さまざまな非常に重いコンポーネントやほとんどの無意味なコンポーネントインターフェースを実装するために必要なBeanに加えて、すべてのBeanに過度に冗長なXMLデプロイメント記述子が必要でした。
**ステートレスセッションBeanは通常プールされますが、ステートフルセッションBeanは通常はプールされません(ただし、プールすることはできます)。したがって、両方のタイプのプールはオプションであり、EJB仕様ではどちらの方法も必須ではありません。