| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
編集の要約なし
==[[Java EE JNDI ENC 注入]]==
[[Java EE]] |
{{amazon|4873115086}}
*アプリケーションサーバーにデプロイされたすべてのEJBコンテナは、Enterprise アプリケーションサーバーにデプロイされたすべての[[EJB]]コンテナは、Enterprise Naming Context(ENC) と呼ばれる独自の内部レジストリを持っている
*これはJNDIで実装されている
==グローバルJNDI==
*EJB3[[EJB]]3.1ではSLSB、SFSBのビューは以下の構文のグローバルJNDIで入手出来る必要がある
java:global[/app-name]/module-name/bean-name [!FQN]
{|class="wikitable"
|-
|app-name
|アプリケーション(またはEARまたはEA[[R]])名(オプション)
|-
|module-name
|モジュール(JARまたはWARJA[[R]]またはWA[[R]])名
|-
|FQN
===利点===
*ベンダにかかわらず、同じ場所でEJBを見つけることができ移植性があるベンダにかかわらず、同じ場所で[[EJB]]を見つけることができ移植性がある
===改善できる点===
*ルックアップコードはベンダー固有の JNDI Context の取得に依存
*キャストが必要で、タイプセーフではない
*自分でJNDI名を作成するため、間違えやすい
===EJBコンテナは一連のタイプセーフな注入メカニズムを提供[[EJB]]コンテナは一連のタイプセーフな注入メカニズムを提供===
*多くの場合、利用可能な参照を取得するのに必要なのは以下だけ
@[[EJB]] MyEJBLocalBusiness My[[EJB]]LocalBusiness bean;
==JNDI ENC==
*EJB3[[EJB]]3.xでは、ENCが強化され、JNDI ENC参照をBeanクラスのフィールドに直接注入できるようになった*このためにアノテーションが主に利用されるがm,XMLデプロイメント記述子も利用可能このためにアノテーションが主に利用されるがm,[[XML]]デプロイメント記述子も利用可能<blockquote>EJB、インターフェースへの参照、JMSキューまたはトピックの送信先、JMS接続ファクトリ、データソース、JCAリソース、プリミティブ型など、様々なものをENCに登録できる[[EJB]]、インターフェースへの参照、JMSキューまたはトピックの送信先、JMS接続ファクトリ、データソース、JCAリソース、プリミティブ型など、様々なものをENCに登録できる</blockquote>
===JNDI ENCへの投入方法===
*2つの異なる方法で設定できる
====XMLによる投入[[XML]]による投入====*ejb-local-ref:MyEJBがMyEJB2のローカルビジネスインターフェースへの参照を必要としていることをEJBコンテナに通知My[[EJB]]がMy[[EJB]]2のローカルビジネスインターフェースへの参照を必要としていることを[[EJB]]コンテナに通知*ejbs/referenceToMyEJB2 referenceToMy[[EJB]]2 という名前でJNDI ENC に登録
<ejb-jar>
<enterprise-bean>
<session>
<ejb-name>MyEJBMy[[EJB]]</ejb-name>
<ejb-local-ref>
<ejb-ref-name>ejbs/referenceToMyEJB2referenceToMy[[EJB]]2</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>org.ejb3book.example.MyEJB2LocalBusinessMy[[EJB]]2LocalBusiness</local> <ejb-link>MyEJB2My[[EJB]]2</ejb-link>
</ejb-local-ref>
</session>
====アノテーションによる設定====
*アノテーションで定義された情報でJNDI ENCに投入
@Stateful(name="MyEJBMy[[EJB]]") @[[EJB]](name="ejbs/referenceToMyEJB2referenceToMy[[EJB]]2",beanInterface=MyEJB2LocalBusinessMy[[EJB]]2LocalBusiness.class,beanName="MyEBJ2") public class MyEJBBean My[[EJB]]Bean implements MyEJBLocalBusiness My[[EJB]]LocalBusiness {
:
}
try {
javax.naming.InitialContext ctx = new InitialContext();
bean = (MyEJB2LocalBusinessMy[[EJB]]2LocalBusiness)ctx.lookup("java:comp/env/ejbs/referenceToMyEJB2referenceToMy[[EJB]]2");
} catch(javax.naming.NamingException ne) {
:
}
====EJBContext[[EJB]]Context====*EJBContextにはENCルックアップメソッドがあり、チェック例外を発生させず、相対名を使う[[EJB]]ContextにはENCルックアップメソッドがあり、チェック例外を発生させず、相対名を使う*SessionContext、MessageDrivenContext いずれも EJBContextを拡張[[EJB]]Contextを拡張 @Resource[[R]]esource
private javax.ejb.SessionContext ctx;
public void hoge() {
MyEJBLocalBusiness My[[EJB]]LocalBusiness bean = ctx.lookup("ejbs/referenceToMyEJB2referenceToMy[[EJB]]2");
}
====アノテーションによる注入====
*ENCルックアップの代わりに、EJB参照をメンバ変数に直接注入できるENCルックアップの代わりに、[[EJB]]参照をメンバ変数に直接注入できる @[[EJB]] private MyEJB2LocalBusiness My[[EJB]]2LocalBusiness bean;
*セッターメソッドを使った注入もサポート
*フィールドに直接注入するより冗長だが、単体テストで簡単にモックできるというメリット
@[[EJB]] public void setBean(final MyEJB2LocalBusiness My[[EJB]]2LocalBusiness bean) {
this.bean = bean;
}
*名前が指定されない場合、ENC名はアノテーションづけされたフィールドやメソッドの完全修飾クラス名とフィールド名やメソッドのベース名から付けられる
=====例=====
org.ejb3book.example.MyEJBBeanMy[[EJB]]Bean/otherBean=====EJB参照[[EJB]]参照(上記例は以下で検索できる)===== java:comp/env/org.ejb3book.example.MyEJBBeanMy[[EJB]]Bean/otherBean====XMLによる注入[[XML]]による注入====
*フィールドの初期化にアノテーションを利用したくない場合、ejb-jar.xmlデプロイメント記述子で<jnjection-target> を利用できる
<ejb-jar>
<enterprise-bean>
<session>
<ejb-name>MyEJBMy[[EJB]]</ejb-name>
<ejb-local-ref>
<ejb-ref-name>ejbs/referenceToMyEJB2referenceToMy[[EJB]]2</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>org.ejb3book.example.MyEJB2LocalBusinessMy[[EJB]]2LocalBusiness</local> <ejb-link>MyEJB2My[[EJB]]2</ejb-link>
<injection-target>
<injection-target-class>
org.ejb3book.example.MyEJBBeanMy[[EJB]]Bean
</injection-target-class>
<injection-target-name>otherBean</injection-target-name>
</enterprise-bean>
</ejb-jar>
====XMLによるオーバーライド[[XML]]によるオーバーライド====
*注入アノテーションを使うと、Beanクラスのコードに構成をハードコーディングすることになるとみなされる場合もある
*EJB仕様ではXMLデプロイメント記述子を使って注入アノテーションをオーバーライドできるEJB仕様では[[XML]]デプロイメント記述子を使って注入アノテーションをオーバーライドできる<blockquote>XMLは常にアノテーションメタデータよりも優先される。XMLはハードコーディングされたアノテーションを再構成する手段を提供する[[XML]]は常にアノテーションメタデータよりも優先される。[[XML]]はハードコーディングされたアノテーションを再構成する手段を提供する</blockquote>
====注入と継承====
*Beanクラスをクラス階層に含めることができる
private SomeInf bean;
@[[EJB]](beanName="SomeEJBSome[[EJB]]")
public void someMethod(SomeInf bean) {
this.bean = bean;
public class MySessionBean extends Base implements MySessionLocalBusiness {
private SomeInf bean;
@[[EJB]](beanName="AnotherEJBAnother[[EJB]]")
public void someMethod(SomeInf bean) {
this.bean = bean;
}
}
*このようにすると、SomeEJBではなく、AnotherEJBが注入されるこのようにすると、Some[[EJB]]ではなく、Another[[EJB]]が注入される<blockquote>someMethod が private の場合、Base には SomeEJBが注入されるSome[[EJB]]が注入される</blockquote>
===参照の注入と型 ===

案内メニュー