4 リソース・アダプタでのContexts and Dependency Injectionの使用
WebLogic Serverは、Connector Architecture 1.7の実装における『JSR 299: Contexts and Dependency Injection for the Java EE Platform』(CDI)を完全にサポートしています。
概要
コネクタ・アーキテクチャ1.7のWebLogic Server実装でのCDIサポートは、以下の関連する仕様に基づいています。
-
『JSR 299: Contexts and Dependency Injection for the Java EE Platform』(
http://www.jcp.org/en/jsr/summary?id=299) -
『JSR 330: Dependency Injection for Java』(
http://jcp.org/en/jsr/summary?id=330)
CDIのこの他の一般的な情報は、以下を参照してください。
-
『Oracle WebLogic Serverアプリケーションの開発』のJava EEプラットフォームのContexts and Dependency Injectionの使用に関する項
-
Java Platform, Enterprise Edition: Java EEチュートリアルのJava EEのコンテキストおよび依存関係インジェクション概要に関する項を参照してください。
リソース・アダプタBeanの検出
beans.xmlがMETA-INFディレクトリにある場合、リソース・アダプタRARはBeanアーカイブです。リソース・アダプタRARがBeanアーカイブの場合、すべてのJARはCDI 1.1標準に準拠する必要があります。 『Oracle WebLogic Serverアプリケーションの開発』のJCAテクノロジでのCDIの使用方法に関する項を参照してください。
アプリケーションがリソース・アダプタRAR Beanアーカイブとしてデプロイされると、WebLogic Serverコネクタ・コンテナは、BeanとBean参照を以下の場所で検索します。
-
リソース・アダプタRAR
-
リソース・アダプタRAR内に直接パッケージ化されたすべてのクラス
-
アダプタRARで参照されるすべてのBeanアーカイブ
リソース・アダプタBeanのコンテキスト参照の取得
java:comp、java:moduleまたはjava:appネームスペースがありません。 したがって、名前付き管理対象Beanをリソース・アダプタのJNDIネームスペースにバインドできません。また、リソース・アダプタのJNDIネームスペースからルックアップを実行したり(Java EE 6管理対象Bean仕様の指定)、Java EE 6 @Resource注釈を使用して事前定義済Beanをインジェクトしたりすることもできません。
ただし、WebLogic ServerではExtendedBootstrapContext.getBeanManager()メソッドが提供されます。リソース・アダプタはgetBeanManagerメソッドを呼び出して、アダプタ・モジュールのBeanManagerインスタンスを公開できます。
他のアプリケーション・タイプからのリソース・アダプタBeanの呼出し
CDI Beanアーカイブとしてデプロイされたリソース・アダプタの使用
-
デプロイされたリソース・アダプタ内の管理対象Bean、デコレータ、インターセプタ、イベントなどを検出する機能
-
サードパーティの移植可能な拡張機能のサポート(『JSR 299: Contexts and Dependency Injection for the Java EE Platform』の第11章「Portable Extensions」で定義)
-
BeanManagerによって公開されるCDI機能のサポート -
リソース・アダプタ内の管理対象BeanでのBeanのインスタンス化、インジェクション、デコレータ、インターセプタ、イベントなどのサポート
次の点に注意してください。
-
リソース・アダプタの
BeanManagerインスタンスは、ExtendedBootstrapContextオブジェクトのgetBeanManagerメソッドによって公開されます。 -
WebLogic Serverでアダプタの
BeanManagerの使用がサポートされるのは、そのアダプタ独自のスレッドにおいてのみです。アダプタのBeanManagerは、別のアプリケーションのスレッドでは使用できません。 -
WebLogic Serverコネクタ・コンテナは、リソース・アダプタ・モジュール内の組込み
BeanManagerBeanタイプのインジェクションをサポートします。たとえば、ResourceAdapterBeanに対するインジェクトがサポートされます。 -
リソース・アダプタの管理対象Beanでの
Resourceインジェクション注釈の使用はサポートされません。
BeanManagerのサポート
リソース・アダプタのBeanManagerは次のいずれかの状況で使用できます。
-
ResourceAdapter.startメソッドの呼出しなど、アダプタのデプロイメント・プロセス -
リソース・アダプタの
WorkManagerインスタンスによってスケジュールされるWork.runメソッド内
WebLogic Serverコネクタ・コンテナは、リソース・アダプタ・モジュール内で組込みBeanManager Beanタイプのインジェクションをサポートします。ただし、呼出し元スレッドによるリソース・アダプタのBeanManagerインスタンスの使用はサポートされません。
インジェクション・ポイント
WebLogic Serverコネクタ・コンテナは、CDI Beanアーカイブとしてデプロイされたリソース・アダプタ内で以下のBeanのインジェクション・ポイントをサポートします。
-
『JSR 299: Contexts and Dependency Injection for the Java EE Platform』によりJava EEコンテナへの提供が求めれられる以下の組込みBean
-
UserTransaction— WebLogic JTAによって提供されます。 -
Principal— WebLogic Serverコネクタ・コンテナによって設定される呼出し側プリンシパル。この値は、インジェクトの時点ではなく、このインスタンスが使用される時点でスレッドのプリンシパルです。 -
ValidationFactory— リソース・アダプタ・モジュール自体のValidationFactoryインスタンス。ExtendedBootstrapContext.getValidatorFactoryメソッドからもアクセスできます。 -
Validator— リソース・アダプタ・モジュール自体のValidatorインスタンス。ExtendedBootstrapContext.getValidatorメソッドからもアクセスできます。
-
-
リソース・アダプタ・モジュールそのものの
BeanManagerインスタンス(『JSR 299: Contexts and Dependency Injection for the Java EE Platform』の11.3項で定義)。ExtendedBootstrapContext.getBeanManagerメソッドからアクセスできます。 -
『JSR 299: Contexts and Dependency Injection for the Java EE Platform』およびJava EE 6管理対象Bean仕様(『JSR 316: Java Platform, Enterprise Edition 6 (Java EE 6) Specification』に含まれる)に準拠する、すべての管理対象Bean。
-
現在のリソース・アダプタ・モジュールに含まれる、以下のタイプの特別なコネクタ・アーキテクチャ1.7組込みBean。
-
現在のリソース・アダプタBeanへの参照のインジェクションを行うことができる
javax.resource.spi.ResourceAdapter。常に、現在のアダプタ・モジュールのResourceAdapterBeanインスタンスまたはnull(ResourceAdapterBeanが現在のリソース・アダプタ・モジュールに定義されていない場合)を参照します。 -
javax.resource.spi.BootstrapContextまたはweblogic.connector.extensions.ExtendedBootstrapContext。現在のリソース・アダプタのBootstrapContextBeanインスタンスまたはnull(ResourceAdapterBeanが現在のリソース・アダプタ・モジュールに定義されていない場合)のいずれかへの参照のインジェクションが可能です。このBeanタイプは、ResourceAdapter.start(BootstrapContext ctx)メソッドの呼出しのパラメータでも使用できます。 -
javax.resource.spi.work.WorkManager。現在のリソース・アダプタのWorkManagerインスタンス(BootstrapContext.getWorkManager()メソッドからも使用できる)またはnull(ResourceAdapterBeanが現在のリソース・アダプタ・モジュールで定義されていない場合)のいずれかへの参照のインジェクションが可能です。 -
javax.resource.spi.XATerminator。現在のリソース・アダプタのXATerminatorインスタンス(BootstrapContext.getXATerminatorメソッドからも使用できる)またはnull(ResourceAdapterBeanが現在のリソース・アダプタ・モジュールで定義されていない場合)のいずれかへの参照のインジェクションが可能です。 -
javax.transaction.TransactionSynchronizationRegistry。JTATransactionSynchronizationRegistryインスタンス(BootstrapContext.getTransactionSynchronizationRegistryメソッドからも使用できる)への参照のインジェクションが可能です。
-
リソース・アダプタ・コンポーネントBeanでのCDIの使用
WebLogic Serverは、リソース・アダプタ・コンポーネントBeanと呼ばれる4種類のBeanをサポートしています。これらによって、WebLogic Serverコネクタ・コンテナで管理される特別なコンポーネントが定義されます。リソース・アダプタ・コンポーネントBeanはPOJO (Plain Old Java Object)です。リソース・アダプタ・コンテナによって作成および管理され、ライフ・サイクルが特殊です。
アダプタ・コンポーネントBeanのタイプは以下のとおりです。
-
ResourceAdapterBean —javax.resource.spi.ResourceAdapterインタフェースを実装するリソース・アダプタ・クラス。ライフ・サイクル管理とメッセージ・エンドポイント設定の処理が含まれます。 -
ManagedConnectionFactoryBean —javax.resource.spi.ManagedConnectionFactoryインタフェースを実装するJavaBeanクラス。これは、ManagedConnectionおよびEIS固有の接続ファクトリ・インスタンス両方のファクトリです。このインタフェースは、ManagedConnectionインスタンスの照合と作成のためのメソッドを提供して、接続プーリングをサポートします。 -
ActivationSpecBean —javax.resource.spi.ActivationSpecインタフェースを実装するJavaBeanクラス。メッセージ・エンドポイントのアクティブ化構成情報を保持します。 -
管理対象オブジェクトまたは管理オブジェクト — メッセージング・スタイルまたはメッセージ・プロバイダに固有のオブジェクトを表すJavaBeanクラスのオプション・セット。
リソース・アダプタ・コンポーネントBeanでは以下のメタデータ注釈を使用できます。
-
@Connector
-
@Activation
-
@ConnectionDefinition
-
@ConnectionDefinitions
-
@AdministeredObject
ノート:
先行注釈はコネクタ・アーキテクチャ1.7に新たに追加されました。ra.xmlの対応する要素のかわりに使用することをお薦めします。
以下の項では、リソース・アダプタ・コンポーネントBeanのプログラミング要件の重要な情報を説明します。
動的に構成可能なプロパティをリソース・アダプタ・コンポーネントBeanに設定する方法の詳細は、「動的に再構成できる構成プロパティ」を参照してください
リソース・アダプタ・コンポーネントBeanを管理対象Beanにしない
リソース・アダプタ・コンポーネントBeanを管理対象Beanにしてはいけません。ただし、『JSR 299: Contexts and Dependency Injection for the Java EE Platform』に定義されているように、WebLogic Serverコネクタ・コンテナでは、リソース・アダプタ・コンポーネントBeanへの管理対象BeanのCDIインジェクションがサポートされます。WebLogic Serverでは、アダプタ・コンポーネントBeanでのPostConstructとPreDestroyの注釈もサポートされます。
ノート:
次の点に注意してください。
-
WebLogic Serverコネクタ・コンテナでは、『JSR 316: Java Platform, Enterprise Edition 6 (Java EE 6) Specification』に含まれるJava EE 6管理対象Bean仕様に準拠する管理対象Beanはサポートされません。
-
JSR 299で必要な条件を満たす管理対象Beanの設計の詳細は、『The Java EE 6 Tutorial』の「About Managed Beans」を参照してください。
リソース・アダプタ・コンポーネントBeanが管理対象Beanとして扱われないようにするために、次のいずれかのクラスレベル注釈がアダプタ・コンポーネントBean内で使用されていると、WebLogic Serverではアダプタのデプロイができません。
-
すべてのスコープ注釈
-
すべての修飾子注釈
-
すべてのステレオタイプ注釈
依存関係インジェクションの使用
CDI Beanアーカイブとしてデプロイされるリソース・アダプタでは、アダプタ・コンポーネントBeanが作成されて初期化されると、WebLogic Serverコネクタ・コンテナはアダプタ・コンポーネントBeanのCDIをサポートします。
『Java Platform, Enterprise Edition (Java EE) Specification, Version 6』のEE.5.20項「Support for Dependency Injection (JSR-330)」に準拠するリソース・アダプタ・コンポーネントBeanの依存関係インジェクションをサポートするために、WebLogicコネクタ・コンテナはそれらのBeanを初期化するときに次の処理を実行します。
- デプロイメント記述子の値を使用して、リソース・アダプタ・コンポーネントBean構成プロパティを初期化します。
- 依存関係インジェクションによって初期化を実行した後で、
PostConstruct注釈を使用します。 - 『JSR 303: Bean Validation』に従ってBean検証を実行し、
ActivationSpecBeanについてvalidate()メソッドを呼び出します。 ResourceAdapterBeanについてstart()メソッドを呼び出します。- すべてのリソース・アダプタ・コンポーネントBeanを、JNDIにバインドするか、エンドポイント・アプリケーションに公開して、使用できるようにします。
インジェクションの使用に関するノート
リソース・アダプタ・コンポーネントBeanは、標準の管理対象Beanではないため、リソース・アダプタ・モジュールの外部の他のBeanにインジェクトすることはできません。つまり、『JSR 299: Contexts and Dependency Injection for the Java EE Platform』に準拠している場合のようにリソース・アダプタ・モジュールの外部で認識されることはありません。インジェクションをサポートするようにアダプタ・コンポーネントBeanを設計できますが、管理対象Beanとして扱われないようにすることが重要です。リクエスト・スコープまたはセッション・スコープの概念は、リソース・アダプタ・コンポーネントBeanでは意味がないためです。
インジェクションは以下のようにサポートされます。
-
フィールドとメソッドのインジェクションは、javax.inject.Inject
注釈を使用してサポートされますが、コンストラクタのインジェクションはサポートされません。 -
インジェクト済フィールド(『JSR 299: Contexts and Dependency Injection for the Java EE Platform』の3.8項の定義)はサポートされます。
-
「インジェクション・ポイント」のすべてのインジェクション・ポイント(
weblogic.transaction.UserTransactionやjavax.resource.spi.BootstrapContextなど)がサポートされます。 -
PostConstructおよびPreDestroyインジェクション注釈は以下のようにサポートされます。-
ResourceAdapterBeanタイプでは、構成プロパティが初期化された後でstart()メソッドが呼び出される前に、@PostConstructメソッドが呼び出されます。また、@PreDestroyメソッドはstop()のメソッドの後に続きます。 -
他のBeanタイプでは、構成プロパティが初期化された後でBeanがJNDIにバインドされる前に、@PostConstructメソッドが呼び出されます。また、@PreDestroyメソッドは、リソース・アダプタがアンデプロイされるときか、サーバーが停止されるときに呼び出されます。
-
すべてのBeanで、WebLogic Serverは『JSR 303: Bean Validation』のサポートに基づいてBean検証を実行します。また、該当する場合には、@PostConstructメソッドを呼び出した後で
validate()メソッドも呼び出します。
-
-
イベント(『JSR 299: Contexts and Dependency Injection for the Java EE Platform』の第10章「Events」で定義)はサポートされます。
-
リリース12.2.1より前のWebLogic Server 12.2.1では、CDI 1.0の仕様に従ってカスタマイズした検証プロバイダを指定した場合でも、アノテーション"@Inject Validator v"でインジェクトされるのは、デフォルトの検証プロバイダのみです。一方、リリース12.2.1以降のWebLogic Serverでは、アノテーション"@Inject Validator v"は、CDI 1.1の仕様に従ってカスタマイズした検証プロバイダをインジェクトします。
Resourceインジェクション注釈はリソース・アダプタ・モジュールではサポートされません。
例
次の例は、リソース・アダプタのデプロイ時に、WebLogic ServerがCDIに対応するMyResourceAdapterインスタンスを最初にインスタンス化するところです。MyResourceAdapterは、Connector注釈が付いているため、この例に示すリソース・アダプタ・モジュールのResourceAdapterコンポーネントBeanです。また、WebLogic Serverではデプロイ時に次の処理も行われます。
-
MyBeanをインスタンス化し、javax.inject.Inject注釈を使用してMyResourceAdapterインスタンスにインジェクトします。 -
このアダプタ・モジュールの
ValidatorインスタンスをMyResourceAdapterインスタンスにインジェクトします。 -
このアダプタ・モジュールの
WorkManagerインスタンスとUserTransactionインスタンスをMyBeanにインジェクトします。
@Connector
public class MyResourceAdapter implements ResourceAdapter{
private @Inject MyBean bean;
private @Validator v;
public void start(BootstrapContext ctx){
v.validate(this, AnotherGroup.class);
bean.do();
.
.
.
}
.
.
.
}
public class MyBean{
private String name;
private @WorkManager wm;
private @UserTransaction ut;
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public void do(){
Work w = …
wm.scheduleWork(w);
}
}