プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Serverリソース・アダプタの開発
12c (12.2.1)
E70013-01
  目次へ移動
目次

前
 
次
 

5 リソース・アダプタでのContexts and Dependency Injectionの使用

この章では、WebLogic Serverのコネクタ・アーキテクチャ1.7の実装における『JSR 299: Contexts and Dependency Injection for the Java EE Platform』(CDI)のサポートについて説明します。

この章の内容は以下のとおりです。

概要

CDI仕様は、インジェクションを使用してアプリケーションに依存関係を指定するための一連のサービスを定義します。CDIでは、コンテキストによるBeanのライフ・サイクル管理、型保証のインジェクション・ポイント、疎結合のイベント・フレームワーク、疎結合のインターセプタとデコレータ、Beanの代替実装、Unified Expression Language (EL)でのBeanナビゲーション、およびCDI拡張機能がサードパーティのフレームワークまたは将来のJava EEコンポーネントをサポートできるようにするサービス・プロバイダ・インタフェース(SPI)が提供されます。

コネクタ・アーキテクチャ1.7のWebLogic Server実装でのCDIサポートは、以下の関連する仕様に基づいています。

CDIのこの他の一般的な情報は、以下を参照してください。

リソース・アダプタBeanの検出

アーカイブ記述子ファイルbeans.xmlMETA-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のコンテキスト参照の取得

リソース・アダプタは、独自のJNDIネームスペースがない点が、WebアプリケーションまたはEJBとは異なります。つまり、リソース・アダプタ・モジュールには、java:compjava:moduleまたはjava:appネームスペースがありません。したがって、名前付き管理対象Beanをリソース・アダプタのJNDIネームスペースにバインドできません。また、リソース・アダプタのJNDIネームスペースからルックアップを実行したり(Java EE 6管理対象Bean仕様の指定)、Java EE 6 @Resource注釈を使用して事前定義済Beanをインジェクトしたりすることもできません。

ただし、WebLogic ServerではExtendedBootstrapContext.getBeanManager()メソッドが提供されます。リソース・アダプタはgetBeanManagerメソッドを呼び出して、アダプタ・モジュールのBeanManagerインスタンスを公開できます。

他のアプリケーション・タイプからのリソース・アダプタBeanの呼出し

WebLogic Serverコネクタ・コンテナでは、リソース・アダプタRAR Beanアーカイブに含まれるCDI Beanクラスを、他のWebアプリケーションまたはEJBにインジェクトすることはサポートされません。WebLogic Serverのサポートには制限があり、アダプタRAR Beanアーカイブ内のCDI Beanを、他の呼出し元WebアプリケーションまたはEJBから使用するか呼び出すことだけが認められています。これは、CDI Beanがクライアント・プロキシではないことが条件です。

CDI Beanアーカイブとしてデプロイされたリソース・アダプタの使用

リソース・アダプタがCDI Beanアーカイブとしてデプロイされる場合、WebLogic Serverコネクタ・コンテナはリソース・アダプタ内で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コネクタ・コンテナは、リソース・アダプタ・モジュール内の組込みBeanManager Beanタイプのインジェクションをサポートします。たとえば、ResourceAdapter Beanに対するインジェクトがサポートされます。

  • リソース・アダプタの管理対象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.6組込みBean。

    • 現在のリソース・アダプタBeanへの参照のインジェクションを行うことができるjavax.resource.spi.ResourceAdapter。常に、現在のアダプタ・モジュールのResourceAdapter Beanインスタンスまたはnull (ResourceAdapter Beanが現在のリソース・アダプタ・モジュールに定義されていない場合)を参照します。

    • javax.resource.spi.BootstrapContextまたはweblogic.connector.extensions.ExtendedBootstrapContext。現在のリソース・アダプタのBootstrapContext Beanインスタンスまたはnull (ResourceAdapter Beanが現在のリソース・アダプタ・モジュールに定義されていない場合)のいずれかへの参照のインジェクションが可能です。このBeanタイプは、ResourceAdapter.start(BootstrapContext ctx)メソッドの呼出しのパラメータでも使用できます。

    • javax.resource.spi.work.WorkManager。現在のリソース・アダプタのWorkManagerインスタンス(BootstrapContext.getWorkManager()メソッドからも使用できる)またはnull (ResourceAdapter Beanが現在のリソース・アダプタ・モジュールで定義されていない場合)のいずれかへの参照のインジェクションが可能です。

    • javax.resource.spi.XATerminator。現在のリソース・アダプタのXATerminatorインスタンス(BootstrapContext.getXATerminatorメソッドからも使用できる)またはnull (ResourceAdapter Beanが現在のリソース・アダプタ・モジュールで定義されていない場合)のいずれかへの参照のインジェクションが可能です。

    • javax.transaction.TransactionSynchronizationRegistry。JTA TransactionSynchronizationRegistryインスタンス(BootstrapContext.getTransactionSynchronizationRegistryメソッドからも使用できる)への参照のインジェクションが可能です。

リソース・アダプタ・コンポーネントBeanでのCDIの使用

WebLogic Serverは、リソース・アダプタ・コンポーネントBeanと呼ばれる4種類のBeanをサポートしています。これらによって、WebLogic Serverコネクタ・コンテナで管理される特別なコンポーネントが定義されます。リソース・アダプタ・コンポーネントBeanはPOJO (Plain Old Java Object)です。リソース・アダプタ・コンテナによって作成および管理され、ライフ・サイクルが特殊です。

アダプタ・コンポーネントBeanのタイプは以下のとおりです。

  • ResourceAdapter Bean — javax.resource.spi.ResourceAdapterインタフェースを実装するリソース・アダプタ・クラス。ライフ・サイクル管理とメッセージ・エンドポイント設定の処理が含まれます。

  • ManagedConnectionFactory Bean — javax.resource.spi.ManagedConnectionFactoryインタフェースを実装するJavaBeanクラス。これは、ManagedConnectionおよびEIS固有の接続ファクトリ・インスタンス両方のファクトリです。このインタフェースは、ManagedConnectionインスタンスの照合と作成のためのメソッドを提供して、接続プーリングをサポートします。

  • ActivationSpec Bean — javax.resource.spi.ActivationSpecインタフェースを実装するJavaBeanクラス。メッセージ・エンドポイントのアクティブ化構成情報を保持します。

  • 管理対象オブジェクトまたは管理オブジェクト — メッセージング・スタイルまたはメッセージ・プロバイダに固有のオブジェクトを表すJavaBeanクラスのオプション・セット。

リソース・アダプタ・コンポーネントBeanでは以下のメタデータ注釈を使用できます。

  • @Connector

  • @Activation

  • @ConnectionDefinition

  • @ConnectionDefinitions

  • @AdministeredObject


注意:

先行注釈はコネクタ・アーキテクチャ1.6に新たに追加されました。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でのPostConstructPreDestroyの注釈もサポートされます。


注意:

次の点に注意してください。

リソース・アダプタ・コンポーネント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を初期化するときに次の処理を実行します。

  1. デプロイメント記述子の値を使用して、リソース・アダプタ・コンポーネントBean構成プロパティを初期化します。

  2. 依存関係インジェクションによって初期化を実行した後で、PostConstruct注釈を使用します。

  3. 『JSR 303: Bean Validation』に従ってBean検証を実行し、ActivationSpec Beanについてvalidate()メソッドを呼び出します。

  4. ResourceAdapter Beanについてstart()メソッドを呼び出します。

  5. すべてのリソース・アダプタ・コンポーネント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.UserTransactionjavax.resource.spi.BootstrapContextなど)がサポートされます。

  • PostConstructおよびPreDestroyインジェクション注釈は以下のようにサポートされます。

    • ResourceAdapter Beanタイプでは、構成プロパティが初期化された後で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」で定義)はサポートされます。

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);
     }
}