私はこの構造が何をするかを大体知っています。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
sはここで何をしますか?彼らはおそらくJNDIから「name1」...オブジェクトを取得または作成しますが、結果はどこに配置しますか?近くに.lookup
呼び出しはありませんが、コードベースが大きいため、これについてはよくわかりません。
ボーナス質問:2つの@Transaction
アノテーションは単にデフォルトを繰り返すと思いますか?
UPDATE:この時点で、@EJBs
は独自の拡張であると主張する複数の人。そうではない。これはJava EE5。詳細については JavaDocを参照してください。 。個々の@EJB
のコンテナです。注釈。
これらのEJBアノテーションを主張するすべての人が検索を行うと信じています。このルックアップの結果がどうなるかを知りたいだけです。
_@EJB
_注釈(および_@Resource
_、_@WebServiceRef
_など)は2つの目的を果たします。
@EJB(name="myEJB")
は、参照_Java:comp/env/myEJB
_を作成します。フィールドに注釈を付けて名前を指定しない場合、参照_Java:comp/env/com.example.MyClass/myField
_が作成されます。参照がlookup("Java:comp/env/myEJB")
のために解決されているか、注入のために解決されているかに関係なく、参照が解決される方法は異なります。
lookup
属性には、ターゲットを解決するためのJNDIルックアップが必要です。mappedName
をサポートしています。これはベンダー固有であると指定されています。これは通常、ルックアップを実行することで実装されます。beanInterface
またはフィールドタイプ)がアプリケーション内の単一のEJBによってのみ実装されている場合、EJB仕様はそれにフォールバックすることを要求します。Java:comp/env/myEJB
_はmyEJB
のルックアップを引き起こす可能性がありますサーバーの名前空間で)。Miljen Mikicの答えは、可能な答えについてのアイデアを与えてくれました。 JNDIを知っている人がこれを読んでいるなら、私が基本的にここで推測しているように、これが正しいかどうか教えてください。
基本的に、JNDIツリーを調べる方法は2つあります。グローバルパス(/ some/proprietary/path/my/bean)とプログラムの環境(Java:comp/env/my/bean)のいずれかです。これは、グローバルパスからローカル環境への参照を作成し、そこからコンポーネントを検索するという考え方です。
@Ejb(name = "Java:comp/env/my/bean"、mappedName = "/ some/proprietary/path/my/bean")は、この参照をJava code(記述子xmlファイルなし)。
これは、@ Ejb(name = "Java:comp/env/my/bean")がそれ自体で何もしないことを意味します。つまり、参照を自分自身にコピーします。副作用として、コンパイル時にこの参照が必要であることをアプリケーションサーバーが認識しているという事実に悪影響を与える可能性がありますが、それはそれについてです。
この link によれば、基本的にこのアノテーションにより、EJBはコンテキストに関連して外部EJBを検索できます。通常、それを行うよりエレガントな方法があります。
ボーナスの質問に関して:はい、トランザクションに関する2つのアノテーションはデフォルトを繰り返しています:デフォルトのTransactionManagementTypeはCONTAINER(vs BEAN)であり、-default-TransactionAttributeType REQUIREDは、トランザクションコンテキスト内でBeanが呼び出された場合、トランザクションが継続されることを単に示しています。そうしないと、新しいトランザクションが開始されます(たとえば、常に新しいtxを作成するREQUIRES_NEWとは対照的です)。これは実際には、Cfに聞こえるほど些細なことではなく、詳細です。 EJB 3.1仕様:
「13.3.7 Beanのメソッドのトランザクション属性の仕様
コンテナ管理のトランザクション境界を持つエンタープライズBeanのBeanプロバイダーは、エンタープライズBeanのメソッドのトランザクション属性を指定できます。デフォルトでは、コンテナ管理のトランザクション境界を持つBeanのメソッドのトランザクション属性の値はREQUIREDトランザクション属性であり、この場合、トランザクション属性を明示的に指定する必要はありません。[...] "