私はこの質問を見つけました: @ Injectと@EJBの違いは何ですか しかし、私はより賢くはなりませんでした。 Java EEを以前に実行したことがなく、依存性注入の経験もないので、何を使用すべきか理解できませんか?
@EJBと古い注入方法ですか? @Injectを使用しているときにこのアノテーションを使用すると、新しいCDIフレームワークを使用するときに、EJBコンテナによって注入が行われますか?それは違いですか?その場合、@ EJBの代わりに@Injectを使用する必要がありますか?
@EJB
は、EJBのみをインジェクトするために使用され、現在かなりの期間利用可能です。 @Inject
は、マネージドBeanを挿入でき、新しいCDI仕様の一部です(Java EE 6以降)。
単純な場合は、@EJB
を@Inject
に変更するだけです。高度な場合(たとえば、@EJB
の属性に大きく依存している場合(beanName
、lookup
、またはbeanInterface
など)、@Inject
を使用する必要があります。 @Producer
フィールドまたはメソッドを定義します。
これらのリソースは、@EJB
と@Produces
の違いとそれらを最大限に活用する方法を理解するのに役立つ場合があります。
Antonio Goncalvesのブログ:
CDIパートI
CDIパートII
CDIパートIII
JBoss Weldドキュメント:
CDIおよびJava EEエコシステム
スタックオーバーフロー:
条件に基づいて@EJB Beanを挿入
@Inject
は任意のBeanを挿入できますが、@EJB
はEJBのみを挿入できます。どちらを使用してもEJBをインジェクトできますが、@Inject
はどこでも好きです。
更新:この回答は間違っているか、古い可能性があります。詳細についてはコメントをご覧ください。
@Inject
から@EJB
に切り替えたのは、@EJB
が循環注入を許可しているのに対し、@Inject
が吐き出しているためです。
詳細:@PostConstruct
メソッドを呼び出すには@Asynchronous
が必要でしたが、同期的にそうしました。非同期呼び出しを行う唯一の方法は、元の呼び出しで別のBeanのメソッドを呼び出し、元のBeanのメソッドをコールバックすることでした。これを行うには、各Beanが他方への参照、つまり循環を必要としました。 @Inject
はこのタスクでは失敗しましたが、@EJB
は機能しました。
このトピックに関する良い議論があります。 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で注入?
- 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で注入?
2009年11月、17:42アメリカ/ニューヨーク|リンクギャビンキング
リモートEJBの方が@EJBの方が良いということですか?
リモートEJBの場合、クライアントは単にそのメタデータにアクセスできないため、Beanクラスで修飾子、@ Alternativeなどのメタデータを宣言することはできません。さらに、ローカルの場合(すべてのグローバルJNDI名)に必要のない追加のメタデータをいくつか指定する必要があります。そのため、すべてのものは別の場所、つまり@Produces宣言に移動する必要があります。
@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 も参照してください
たとえば、インジェクションは、@ Resource、@ PersistentUnit、または@EJBアノテーションを使用してJava EE 5にすでに存在します。ただし、特定のリソース(データソース、EJBなど)および特定のコンポーネント(サーブレット、EJB、JSFバッキングBeanなど)に限定されていました。 CDIを使用すると、@ Injectアノテーションのおかげで、どこにでもほとんど何でも注入できます。