インターフェース BuildCompatibleExtension
public interface BuildCompatibleExtension
ビルド互換拡張機能は、ServiceLoader
SE で定義されているように、このインターフェースのサービスプロバイダーです。つまり、これらは、このインターフェースを実装し、META-INF/services
ファイルを提供し、他のすべてのサービスプロバイダーの制約を満たすクラスです。さらに、ビルド互換拡張機能は Bean であってはならず、アプリケーションコードによって参照されてはなりません。ビルド互換拡張機能は、拡張アノテーションの 1 つでアノテーションが付けられた型パラメーターなしで、任意の
public
、非 static
、void
を返すメソッドを定義できます。このようなメソッドは拡張メソッドと呼ばれます。拡張メソッドは、5 つの拡張アノテーションに対応する 5 つのフェーズで実行されます。
拡張メソッドは、任意の数のパラメーターを宣言できます。各実行フェーズでは、対応する拡張アノテーションに記載されているように、さまざまな型のパラメーターを宣言できます。拡張メソッドが呼び出されると、すべてのパラメーターがコンテナーによって提供されます。拡張メソッドが実行フェーズでサポートされていない型のパラメーターを宣言すると、コンテナーはそれを デプロイ問題として扱います。
@Priority
を使用して、拡張メソッドに優先順位を割り当てることができます。優先度の値が小さい拡張メソッドが最初に呼び出されます。優先度が指定されていない拡張メソッドのデフォルトの優先度はPriority.APPLICATION
+ 500 です。2 つの拡張メソッドの優先度が等しい場合、それらの順序は未定義です。優先度は、単一フェーズ内の拡張メソッドの順序にのみ影響することに注意してください。ビルド互換拡張機能ごとに、コンテナーは 1 つのインスタンスを作成します。すべての拡張メソッドは、同じインスタンスで呼び出されます。
拡張メソッドが呼び出されるとき、CDI コンテナーが実行されている必要はないため、拡張メソッドから
CDI.current()
を呼び出したり、他の方法で実行中の CDI コンテナーにアクセスしようとすると、移植性のない動作が発生します。ビルド互換性のある拡張機能は、特定の移植可能な拡張機能が存在する場合に無視されることが想定されている場合、
@SkipIfPortableExtensionPresent
のアノテーションが付けられる場合があります。CDI 実装は、
jakarta.enterprise.lang.model
またはjakarta.enterprise.inject.build.compatible.spi
インターフェースのカスタム実装を受け入れる必要はありません。つまり、ユーザーは、対応する API から以前に取得したこれらのインターフェースのインスタンスのみを使用できます。そうでない場合、移植性のない動作が発生します。ビルド互換拡張機能では、
AnnotationTarget
の実装は、実行時SEの保持ポリシーを持つアノテーションのみを返します。- 導入:
- 4.0