web-dev-qa-db-ja.com

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

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

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

140
LuckyLuke

@EJBは、EJBのみをインジェクトするために使用され、現在かなりの期間利用可能です。 @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エコシステム

スタックオーバーフロー:
条件に基づいて@EJB Beanを挿入

170
Piotr Nowicki

@Injectは任意のBeanを挿入できますが、@EJBはEJBのみを挿入できます。どちらを使用してもEJBをインジェクトでき​​ますが、@Injectはどこでも好きです。

31
Bozho

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

@Injectから@EJBに切り替えたのは、@EJBが循環注入を許可しているのに対し、@Injectが吐き出しているためです。

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

14
necromancer

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

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

または

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

再:@EJBまたは@Injectで注入?

  1. 2009年11月、20:48アメリカ/ニューヨーク|リンクギャビンキング

EJBローカル参照は常にシリアライズ可能である必要があるため、このエラーは非常に奇妙です。おそらくグラスフィッシュのバグ?

基本的に、@ Injectは次の理由により常に優れています。

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

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

そして

再:@EJBまたは@Injectで注入?

  1. 2009年11月、17:42アメリカ/ニューヨーク|リンクギャビンキング

    リモートEJBの方が@EJBの方が良いということですか?

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

12
John Manko

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

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

@EJBの代わりに@Injectを使用することは同じではありません。

詳細については stateless session beans identity も参照してください

4
ken

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

0
javierZanetti