@EJBまたは@Injectを使用する必要がありますか


148

私はこの質問を発見した:@Injectと@EJBの違いは何ですが、私はどんな賢明を取得できませんでした。私は以前にJava EEを実行したことがなく、依存性注入の経験もないので、何を使用すればよいのか理解できません。

@EJBは古い注入方法ですか?@Injectを使用しているときにこのアノテーションを使用すると、EJBコンテナによってインジェクションが行われますか?新しいCDIフレームワークを使用しますか?これは違いますか?これが当てはまる場合、@ EJBの代わりに@Injectを使用する必要がありますか?

回答:


178

@EJBEJBのだけを注入するために使用され、現在かなりの時間のために利用可能です。@Inject管理対象Beanを挿入でき、新しいCDI仕様の一部です(Java EE 6以降)。

簡単な例では、単純に変更することができます@EJB@Inject。より高度な例では(例えば、あなたが大きく依存するとき@EJBのような属性beanNamelookupまたはbeanInterface使用するために、より)@Injectあなたが定義する必要があります@Producerフィールドやメソッドを。

これらのリソースは、間の違いを理解するのに役立つかもしれない@EJB@Produces彼らの最高を取得するとどのように:

Antonio Goncalvesのブログ:
CDIパートI
CDIパートII
CDIパートIII

JBoss Weldのドキュメント:
CDIとJava EEエコシステム

StackOverflow:
条件に基づいて@EJB Beanを注入する


4
なぜ@EJB循環注入で機能するのですか(1つのシングルトンBeanと別のBeanが相互参照を必要とする)?(以下の私の回答を参照して-私がに切り替えて正しいことをしているのかどうかわかりません@EJB
ネクロマンサー2013年

2
実装を注入するのではなく、実装に介入するプロキシのためです。このため、「遅延バインディング」やその他のコンテナ機能の利点が得られます。
彼は

33

@Inject任意のBeanを注入できますが、@EJBEJBのみを注入できます。どちらでもEJBの注入に使用できますが、私は@Injectどこでも好きです。


1
@Injectを使用する場合、正確にインジェクションを構成するものは何ですか?JavaEEコンテナ?POJOを注入できますか?
Koray Tugay 2013年

3
CDIでは、CDIコンテナー(JavaEEコンテナーにバンドルされています)です
Bozho

16

更新:この回答は正しくないか、古くなっている可能性があります。詳細についてはコメントをご覧ください。

に変更@Inject@EJBたの@EJBは、循環注入が可能であるのに対して、@Inject吐き気がするためです。

詳細:メソッド@PostConstructを呼び出す必要@Asynchronousがありましたが、それは同期的に行われます。非同期呼び出しを行う唯一の方法は、元の呼び出しで別のBeanのメソッドを呼び出し、元のBeanのメソッドを呼び出すことでした。これを行うには、各Beanが他のBeanへの参照、つまり循環型を必要としました。@Injectこのタスクに失敗しましたが、@EJB機能しました。


@MartijnBurgerコードが手元になく、Java EE環境も手元にありません。2つのJavaクラスを作成し、@Injectそれらを互いのパブリックフィールドに入れます。それがうまくいくなら、私の答えは間違っています。それがうまくいかない場合、私の答えは今のところ正しいです。次にをに変更@Injectします@EJB(クラスに注釈を付けることもできますか?忘れます)。その後、サイクリック相互注入は正常に機能します。そのため、からに切り替えまし@Inject@EJB。これが理にかなっているといいのですが。
ネクロマンサー

2つのpojoを作成し、pojoを互いに注入しました。私の構成で問題なく動作します(WildFly 8.2 = CDI 1.2)
Martijn Burger

1
@MartijnBurgerに感謝します、私はそれを確認し、その間私の注意に注意のメモを追加します。
ネクロマンサー、2015

あなたが達成したかったことは正確にはわかりませんが、これはおそらくあなたが望んでいたことを正確に実行し、循環依存はありません。tomee.apache.org/examples-trunk/async-postconstruct/README.html。また、非同期CDIイベントの方が(要件によっては)よりクリーンな方法です。
JanM

12

これは、このトピックに関する良い議論です。Gavin Kingは、非リモートEJBに対して@EJBよりも@Injectを推奨しています。

http://www.seamframework.org/107780.lace

または

https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace

Re:@EJBまたは@Injectで注入する?

  1. 2009年11月20:48 America / New_York | リンクギャビンキング

EJBローカル参照は常にシリアライズ可能であるべきなので、そのエラーは非常に奇妙です。Glassfishのバグでしょうか?

基本的に、@ Injectの方が常に優れています。

it is more typesafe,
it supports @Alternatives, and
it is aware of the scope of the injected object.

リモートEJBへの参照を宣言する場合を除き、@ EJBの使用はお勧めしません。

そして

Re:@EJBまたは@Injectで注入する?

  1. 2009年11月17:42 America / New_York | リンクギャビンキング

    @EJBはリモートEJBの方が優れているという意味ですか?

リモートEJBの場合、Beanクラスで修飾子や@Alternativeなどのメタデータを宣言することはできません。これは、クライアントがそのメタデータにアクセスできないためです。さらに、ローカルケース(グローバルJNDI名は何でもよい)では不要な追加のメタデータを指定する必要があります。したがって、これらすべてのものは別の場所、つまり@Produces宣言に移動する必要があります。


1
これは理論的には質問に回答するかもしれませんが、回答の本質的な部分をここに含め、参照用のリンクを提供することが望ましいでしょう。そうすれば、リンクが切れたときでも、この回答は今でも価値があります。
Mifeet


4

@EJBと@Injectを使用するときに、セッションBeanのIDの用語の違いを理解することも役立つ場合があります。仕様によると、次のコードは常に次のようになりますtrue

@EJB Cart cart1;
@EJB Cart cart2;
 if (cart1.equals(cart2)) { // this test must return true ...}

@EJBの代わりに@Injectを使用しても、同じことはありません。

詳細については、ステートレスセッションBeanのIDも参照してください


0

インジェクションは、たとえば@ Resource、@ PersistentUnit、または@EJBアノテーションを使用してJava EE 5にすでに存在していました。ただし、特定のリソース(データソース、EJBなど)と特定のコンポーネント(サーブレット、EJB、JSFバッキングBeanなど)に限定されていました。CDIを使用すると、@ Injectアノテーションのおかげでほぼどこにでも注入できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.