CDIとEJBはどのように比較されますか?相互作用する?


106

2つがどのように相互作用し、それらの境界がどこにあるかを理解するのに苦労しています。それらは重なりますか?それらの間に冗長性はありますか?

両方に関連付けられている注釈があることは知っていますが、簡単な説明で両方の完全なリストを見つけることができませんでした。これがそれらがどのように異なるのか、またはそれらがどこで重複するのかを明確にするのに役立つかどうかはわかりません。

本当に混乱しています。私は(私は)EJBをかなりよく理解していると思います。CDIがテーブルにもたらすものと、EJBがすでに提供しているものに取って代わるか、拡張する方法を正確に理解するのに苦労していると思います。


3
この質問は、Googleの「EJB CDI差異」検索で上位にソートされていますが、stackoverflow.com
/ questions / 13487987 /…

回答:


50

CDI:依存性注入についてです。これは、インターフェースの実装をどこにでも注入できることを意味します。このオブジェクトは何でもかまいませんが、EJBとは関係ありません。ここで CDIを使用して乱数発生器を注入する方法の例です。EJBについては何もありません。非EJBサービス、さまざまな実装、またはアルゴリズムを注入する場合は、CDIを使用します(そのため、EJBはまったく必要ありません)。
EJB:あなたは理解しています、そしておそらくあなたは@EJB注釈に混乱しています-それはあなたがサービスまたは何かに実装を注入することを可能にします。主な考え方は、注入するクラスは、EJBコンテナで管理する必要があるということです。CDIはEJBが何であるかを理解しているようですので、Java EE 6準拠サーバーでは、サーブレットで両方を記述できます

@EJB EJBService ejbService;

そして

@Inject EJBService ejbService;

それが混乱を招く原因ですが、EJBとCDIの間の橋渡しとなるのはおそらくそれだけです。

CDIについて話しているときは、他のオブジェクトをCDI管理クラスに挿入できます(CDI対応のフレームワークで作成する必要があります)。

他にCDIが提供するもの...たとえば、MVCフレームワークとしてStruts 2を使用すると(単なる例)、EJB 3.1を使用してもここでは制限されます@EJB。Strutsアクションでアノテーションを使用することはできません。これはコンテナーによって管理されません。ただし、Struts2-CDIプラグインを追加する@Injectと、同じものに注釈を書き込むことができます(そのため、JNDIルックアップは不要です)。このように、EJBの機能を強化しますが、前述したように、CDIで何を注入するか-EJBに関連するかどうかは関係ありません。それがその機能です。

PS。例へのリンクを更新


@EJBと@Injectは本当に機能的に同等ですか?私を混乱させたのは、CDIと残りのJava EE頭字語スープのいくつかとの間の注入方法の重複であったと思います。より多くの読書は、注釈を揃える希望があることを示しているようです。
Tim

@Maxym @ Injectを使用する場合、@ステートレスまたはEJBの他のサーバー側コンポーネントが、コンテナーによって提供されるプーリングや同時実行性などの機能を引き続き使用できるようにする方法 これがCDIで提供されていないことを望みますか?
Bala

1
@Bala:CDIは、プール...見て提供していないEJB3.1の有無にかかわらずCDIを ..それは、あなたの質問に答える願っています
Maxym

@KorayTugay:CDIはJava EE機能であるため、Java EE 6準拠のサーバーにはそれがあります(Glassfish 3.0.1 +、JBoss 6+などは間違いありません)。たとえばTomcatで使用できます...
Maxym

191

現在、Java EEには複数のコンポーネントモデルがあるため、実際には少し混乱しています。それらは、CDIEJB3、およびJSFマネージドBeanです。

CDIはブロックの新しい子供です。CDI Beanの機能dependency injectionscopingおよびevent bus。CDI Beanは、インジェクションとスコープに関して最も柔軟性があります。イベントバスは非常に軽量で、最も単純なWebアプリケーションにも非常に適しています。これに加えて、CDI portable extensionsはと呼ばれる非常に高度な機能も公開しています。これは、ベンダーがすべての実装(Glassfish、JBoss AS、Websphereなど)で利用できるようにするJava EEに追加機能を提供するプラグインメカニズムの一種です。 。

EJB3 Beanは、古いレガシーEJB2コンポーネントモデル*から改良されたものであり、Java EEで最初にアノテーションを介して管理されるBeanでした。EJB3 Beanが備わっていますdependency injectiondeclarative transactionsdeclarative securitypoolingconcurrency controlasynchronous executionremoting

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仕様ではどちらの方法も必須ではありません。


3
「EJB3 Beanにはスコープの概念がありません」、「EJB3には独自のイベントバスはありません」という発言に少し混乱しています。これは、「EJB CDI Beanであり、したがってCDIのすべての利点ある」というDavid Blevinの主張とどのように一致しますか?この点について、あなたが回答を書いたときとDavidが彼のブログエントリを書いたときの間で何か変わったことはありますか?
Chris

5
実際には「CDI Bean」は実際には存在しないが、マネージドBeanに適用されるサービスがあるのは、おそらくやや混乱する概念のためです 。議論のために、人々(そして私自身)はとにかくそれらを「CDI Bean」と呼びます。CDIの前は、EJB Beanには明示的なスコープはありませんでした。 CDIが利用可能で、EJB BeanはCDIを利用することができスコープを提供CDI仕様がなければ、単にEJBの仕様を見ているときに、明示的なスコープはありません。。
Arjan Tijms

1
「マネージドBeanに適用されるサービスはありますか」とはどういう意味ですか?それは実際にはCDI Beanのようなものがないことを意味しますか?POJO-EJB-またはJSFマネージドBeanのいずれかに追加機能を提供するものの一部に過ぎませんか?JSFマネージドBeanでInjectアノテーションを使用できるようにしたいですか?
Koray Tugay 2013

3
@Chrisは、EJB仕様の観点からさらに明確にするために、EJB実装がEJBのCDI機能セットを100%サポートする必要があることをCDIの最初から慎重に決定しました。ステートフルBeanのみに制限する必要があったスコープを除いて、CDIのすべての側面がEJBで機能します。
David Blevins、2014年

1
JSF 2.2はjavax.faces.view.ViewScopedを提供することに注意してください。これは、本質的にJSFビュースコープのCDIへのポートであるCDI拡張です。これにより、CDIはJSFマネージドBeanの完全な代替品になります。
jdessey 14

-1

アルバート・アインシュタイン: If you can't explain it simply, you don't understand it well enough

EJBとCDIの理解は非常に簡単です。

EJB:

  1. @ Stateless、@ Stateful、@ Requestなどのスコープ修飾子によって常に注釈が付けられます
  2. Ejbsのインスタンスは、Java EEフレームワークによって制御され、プールされます。消費者にインスタンスを提供するのはEEフレームワークの義務です。

@Stateless

 public class CarMaker(){
    public void createCar(Specification specs){
        Car car = new Car(specs);
    }
}

CarMakerは特定のEjbsスコープで注釈されているため、Ejbです。

CDI:

  1. 完全にEEフレームワークによって管理されるのではなく、インスタンスは自分で作成する必要があります。
  2. それは常に依存しています。「依存」について例を挙げて説明します。

    class Specification { private String color; private String model; //- Getter and Setter }

SpecificationそれはEJBスコープでアノテートされておらず、また、これがためにあなたのコードではありませんEEフレームワークによって初期化されているのでクラスは、CDIです。ここで注意すべき点は、Specificationクラスに注釈を付けていないため、デフォルトでは注釈によって@Dependent注釈が付けられることです。

@Dependent  <- By default added 
class Specification { ... }

Further reading: EjbsスコープアノテーションとCDIスコープアノテーションの間でさらに検討する必要があります。これにより、概念がさらに明確になります。


アインシュタインはまた、次のように述べています。「すべてを可能な限り単純にする必要がありますが、単純にすることはできません」ここでは、「made」を「explained」に置き換えることができます(すべきです)。
Kukeltje
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.