この章では、WebLogic Server 12.1.3のコネクタ・アーキテクチャ1.6の実装における『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.6の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 EE 6 Tutorial』の「Introduction to Contexts and Dependency Injection for the Java EE Platform」
リソース・アダプタRARがBeanアーカイブの場合、WebLogic ServerはRAR内のすべてのJARファイルを、検出できるBeanアーカイブとして扱います。これは、それらのJARにMETA-INF/beans.xml
ファイルが含まれるかどうかに関係ありません。アーカイブ記述子ファイルbeans.xml
がMETA-INF
ディレクトリにある場合、リソース・アダプタRARはBeanアーカイブです。
WebLogic Serverでは、RAR内のネストされたJARに存在するbeans.xml
ファイルは無視されます。
アプリケーションがリソース・アダプタRAR Beanアーカイブとしてデプロイされると、WebLogic Serverコネクタ・コンテナは、BeanとBean参照を以下の場所で検索します。
リソース・アダプタRAR
リソース・アダプタRAR内に直接パッケージ化されたすべてのクラス
アダプタRARで参照されるすべてのBeanアーカイブ
リソース・アダプタは、独自のJNDIネームスペースがない点が、WebアプリケーションまたはEJBとは異なります。つまり、リソース・アダプタ・モジュールには、java:comp
、java:module
またはjava:app
ネームスペースがありません。したがって、名前付き管理対象Beanをリソース・アダプタのJNDIネームスペースにバインドできません。また、リソース・アダプタのJNDIネームスペースからルックアップを実行したり(Java EE 6管理対象Bean仕様の指定)、Java EE 6 @Resource
注釈を使用して事前定義済Beanをインジェクトしたりすることもできません。
ただし、WebLogic ServerではExtendedBootstrapContext.getBeanManager()
メソッドが提供されます。リソース・アダプタはgetBeanManager
メソッドを呼び出して、アダプタ・モジュールのBeanManager
インスタンスを公開できます。
WebLogic Serverコネクタ・コンテナでは、リソース・アダプタRAR Beanアーカイブに含まれるCDI Beanクラスを、他のWebアプリケーションまたはEJBにインジェクトすることはサポートされません。WebLogic Serverのサポートには制限があり、アダプタRAR Beanアーカイブ内のCDI Beanを、他の呼出し元WebアプリケーションまたはEJBから使用するか呼び出すことだけが認められています。これは、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
は次のいずれかの状況で使用できます。
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
メソッドからも使用できる)への参照のインジェクションが可能です。
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にしてはいけません。ただし、『JSR 299: Contexts and Dependency Injection for the Java EE Platform』に定義されているように、WebLogic Serverコネクタ・コンテナでは、リソース・アダプタ・コンポーネントBeanへの管理対象BeanのCDIインジェクションがサポートされます。WebLogic Serverでは、アダプタ・コンポーネントBeanでのPostConstruct
とPreDestroy
の注釈もサポートされます。
注意: 次の点に注意してください。
|
リソース・アダプタ・コンポーネント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検証を実行し、ActivationSpec
Beanについてvalidate()
メソッドを呼び出します。
ResourceAdapter
Beanについて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
インジェクション注釈は以下のようにサポートされます。
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); } }