web-dev-qa-db-ja.com

@Injectと@EJBの違いは何ですか

私は現在、新しいJava EE 6コンポーネントモデルを学習しており、最新の依存関係注入メカニズムと混同されています。したがって、以下が私の質問です。

1)@Injectと@EJBの違いは何ですか

2)別のPOJO(そのうちの1つはDAOコード)を含む単純なPOJOがある場合、@ Injectまたは@EJBのどちらがより良い選択でしょうか?

@Injectと@EJBを混在させることはできますか?

例は次のとおりです。

  • ClassAはInterfaceAを実装し、ClassA_Adaptorのインスタンスを持っています

  • ClassA_AdaptorはInterfaceABを実装し、ClassBのインスタンスを持っています

  • ClassBはInterfaceBを実装し、ClassB_AdaptorのインスタンスとDAO_ClassBのインスタンスを持っています

  • ClassB_AdaptorはInterfaceBを実装し、ClassCのインスタンスを持っています

  • ClassCはInterfaceBCを実装し、WebService_ClassCのインスタンスを持っています

  • DAO_ClassBはJPA 2.0(@PersistenceContext)を使用します

DAOとWebServiceを含め、それらすべてを注入したいと思います。

3)特定の操作でのみトランザクションを使用するのは悪いアプローチですか?

例:DAO_ClassBの一部のメソッドは一般的なクエリですが、他のメソッドは「書き込み」メソッドです。 "READ"メソッドをトランザクションでラップしないのは悪いことですか?

私の理解では、DAO_ClassBは@EJBを使用してトランザクションでラップできます(DAO_ClassBを挿入し、すべてのメソッドをトランザクション化します)。どうすれば制御できますか?

Java EE 6の新しいコンポーネントモデルのほんの一部しかわからないので、質問のいくつかが混乱している場合は申し訳ありません。

37
xandross
  1. @EJBはEJBのみを注入しますが、@ Injectを使用してEJBではなくPOJOを注入できます。ただし、@ Injectでは、アーカイブがBDA(EE 6の場合はbeans.xmlを含む、またはEE 7の場合は暗黙的に含まれる)である必要があります。 @Injectには、追加のCDI固有の機能(スコープ、インターセプターなど)もありますが、これらの機能では追加のオーバーヘッドが発生します。アプリケーションサーバーは@EJBバインディングの指定をサポートしているため、デプロイヤーはターゲットEJBを選択できますが、@ Injectはアプリケーション開発者がターゲットEJBを選択することしかできません(アプリケーションに存在する必要があります)。

  2. ターゲットがEJBでない場合は、@ EJBを使用しないでください。

  3. これは、相互に関連する複数のクエリを作成してからビジネス上の意思決定を試みるかどうかによって異なります。読み取り専用操作の場合でも、分離レベルを理解して考慮に入れる必要があります。

31
Brett Kail

から Adam Biens Weblog:

両方のアノテーションを使用してEJBを注入できます。 @Injectから始めて、問題が発生した場合は、@ EJBに切り替えます。

@Inject does not have any methods / attributes--it is just a plain annotation:


@Target(value = {ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface Inject {
}

一方、@ EJBアノテーションを使用すると、リモートEJBを参照するのに役立つ可能性のある追加情報や、「構成の規約」スタイルで単純に挿入できないEJBを渡すことができます。

@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface EJB {

    public String name() default "";

    public String beanName() default "";

    public Class beanInterface() default Object.class;

    public String mappedName() default "";
}
10
  1. @InjectはEJBよりも一般的で、CDI仕様の一部です。したがって、@ Injectを使用する場合は、サーバーに実装する必要があります。

  2. EJBではなくPOJOの場合は、@ Injectを使用する必要があります。

6
victor herrera