41

この構造が何をするかを大まかに知っています。SomeTypeEJBを作成し、オブジェクトを別のEJBに挿入します。

 @EJB(name="name1")
 SomeType someVariable

今、私はこのように始まるクラスを持っています:(私はすべてのクラスレベルの注釈を与えますが、私はそれだけ@EJBsが関連していると思います)

@Remote(SomeClass.class)
@Stateless(name="someName")
@EJBs({@EJB(name="name1",beanInterface=Type1.class),
       @EJB(name="name2",beanInterface=Type2.class)})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class X extends Y{ 
  //code

ここで何を@EJBしますか?彼らはおそらくJNDIから「name1」...オブジェクトを取得または作成しますが、結果はどこに配置されますか?.lookup近くに電話はありませんが、コードベースが巨大なので、よくわかりません。

ボーナスの質問:2つの@Transaction注釈は単にデフォルトを繰り返すと思いますか?

更新:@EJBsこの時点で複数の人が独自の拡張機能であると主張しました。そうではない。これは、JavaEE5のコア部分です。詳細については、JavaDocを参照してください。@EJBこれは、個々の注釈の単なるコンテナです。

これらのEJBアノテーションを主張する人は誰でもルックアップを行うと思います。このルックアップの結果がどうなるか知りたいだけです。

4

4 に答える 4

42

@EJB注釈(および、など)には2つの目的が@Resourceあります。@WebServiceRef

  1. コンポーネントの名前空間で参照を宣言します。たとえば@EJB(name="myEJB")、参照を作成しますjava:comp/env/myEJB。フィールドに注釈を付け、名前を指定しない場合、参照が作成されますjava:comp/env/com.example.MyClass/myField
  2. アノテーションがフィールドまたはセッターメソッドで宣言されている場合、コンテナーはコンポーネントの作成時にインジェクションを実行します。

参照が解決される方法は、参照が解決されるか、lookup("java:comp/env/myEJB")注入が原因であるかに関係なく異なります。

  1. EE 6+が使用されている場合、lookup属性はターゲットを解決するためにJNDIルックアップを必要とします。
  2. 一部のアプリケーションサーバーmappedNameは、ベンダー固有に指定されているをサポートします。これは通常、ルックアップを実行することによって実装されます。
  3. アプリケーションサーバーは、展開時にバインディングをサポートします。これは通常、ルックアップを実行することによって実装されます。
  4. 他のバインディング情報が提供されておらず、Beanインターフェース(beanInterfaceまたはフィールドタイプ)がアプリケーション内の単一のEJBによってのみ実装されている場合、EJB仕様ではそれにフォールバックする必要があります。
  5. 他のバインディング情報が提供されず、#4が機能しない場合、一部のアプリケーションサーバーは、参照名に基づいてサーバー名前空間でルックアップを実行しようとします(たとえば、サーバー名前空間でjava:comp/env/myEJBのルックアップが発生する可能性がありmyEJBます)。
于 2012-09-12T14:09:52.727 に答える
2

このリンクによると、基本的にこのアノテーションにより、EJBはコンテキストに関連して外部EJBを検索できます。通常、それを行うにはもっとエレガントな方法があります。

于 2012-09-10T13:38:48.703 に答える
2

ミリエン・ミキッチの答えは私に可能な答えについての考えを与えました。JNDIについて知っている人がこれを読んだら、基本的にここで推測しているので、これが正気かどうか教えてください。

基本的に、JNDIツリーを調べるには2つの方法があります。グローバルパス(/ some / property / path / my / bean)とプログラムの環境(java:comp / env / my / bean)のいずれかです。アイデアは、グローバルパスからローカル環境への参照を作成し、そこからコンポーネントを検索することです。

したがって、@ Ejb(name = "java:comp / env / my / bean"、mappedName = "/ some / property / path / my / bean")は、Javaコード(記述子xmlファイルなし)からこの参照を作成します。

これは、@ Ejb(name = "java:comp / env / my / bean")がそれ自体でノーオペレーションであることを意味します。参照をそれ自体にコピーします。副作用として、アプリケーションサーバーがコンパイル時にこの参照が必要であることを認識しているという事実がありますが、それだけです。

于 2012-09-12T07:51:32.113 に答える
1

ボーナスの質問について:はい、トランザクションに関する2つのアノテーションはデフォルトを繰り返しています:デフォルトのTransactionManagementTypeはCONTAINER(vs BEAN)であり、-default --TransactionAttributeType REQUIREDは、Beanがトランザクションコンテキスト内で呼び出された場合、トランザクションが継続されることを示しています。それ以外の場合は、新しいトランザクションが開始されます(たとえば、常に新しいtxを作成するREQUIRES_NEWとは対照的です)。これは実際には、Cfのように聞こえるほど簡単ではありません。EJB 3.1仕様:

"13.3.7Beanのメソッドのトランザクション属性の仕様

コンテナ管理のトランザクション境界を持つエンタープライズBeanのBeanプロバイダは、エンタープライズBeanのメソッドのトランザクション属性を指定できます。デフォルトでは、コンテナ管理のトランザクション境界を持つBeanのメソッドのトランザクション属性の値はREQUIREDトランザクション属性であり、この場合、トランザクション属性を明示的に指定する必要はありません。[...] "

于 2014-12-27T02:28:40.740 に答える