パッケージ jakarta.enterprise.context

スコープとコンテキストに関連するアノテーションとインターフェース。

スコープ型は、@Scope または @NormalScope アノテーションが付けられた Java アノテーションです。Bean のスコープは、インスタンスのライフサイクルと可視性を決定します。特に、スコープは以下を決定します。

  • Bean の新しいインスタンスが作成されたとき
  • Bean の既存のインスタンスが破棄されたとき
  • どの注入された参照が Bean のインスタンスを参照しているか

組み込みスコープ

次の組み込みスコープが提供されています: @Dependent@RequestScoped@ConversationScoped@SessionScoped@ApplicationScoped@Singleton

コンテナーは、組み込みスコープごとに Context インターフェースの実装を提供します。組み込みのリクエスト、セッション、アプリケーションコンテキストは、サーブレット、Web サービス、EJB の呼び出しをサポートします。組み込みの会話コンテキストは JSF リクエストをサポートします。

他の種類の呼び出しの場合、ポータブル拡張機能は、組み込みスコープのいずれかまたはすべてのカスタムコンテキストオブジェクトを定義できます。例: サードパーティの Web アプリケーションフレームワークは、組み込みの会話スコープの会話コンテキストオブジェクトを提供する場合があります。

組み込みスコープに関連付けられたコンテキストは、EJB ローカルビジネスメソッドの呼び出しを含む、ローカルの同期 Java メソッド呼び出し全体に伝播します。コンテキストは、リモートメソッドの呼び出し間、または JMS メッセージリスナーや EJB タイマーサービスのタイムアウトなどの非同期プロセスには伝播しません。

通常のスコープと疑似スコープ

ほとんどのスコープは通常のスコープです。通常のスコープは @NormalScope を使用して宣言されます。Bean に通常のスコープがある場合、特定のスレッドで実行されるすべてのクライアントは、Bean の同じコンテキストインスタンスを参照します。このインスタンスは、Bean の現在のインスタンスと呼ばれます。通常のスコープ型のコンテキストオブジェクトの操作 Context.get(Contextual) は、常に指定された Bean の現在のインスタンスを返します。

通常のスコープではないスコープは、疑似スコープと呼ばれます。疑似スコープは @Scope を使用して宣言されます。疑似スコープの場合、現在のインスタンスの概念は明確に定義されていません。同じスレッドで実行されている異なるクライアントは、Bean の異なるインスタンスを参照する場合があります。@Dependent 疑似スコープの極端なケースでは、すべてのクライアントが Bean の独自のプライベートインスタンスを持っています。

@Dependent および @Singleton 疑似スコープを除いて、すべての組み込みスコープは通常のスコープです。

コンテキストに基づいた、注入された参照の有効性

プログラムによるルックアップを介してコンテナーから取得された Bean への参照は、コンテキスト参照と呼ばれます。通常のスコープを持つ Bean のコンテキスト参照は、Bean の現在のインスタンスを参照します。Bean のコンテキスト参照は、特定の期間のみ有効です。アプリケーションは、無効な参照のメソッドを呼び出さないでください。

Bean のコンテキスト参照の有効性は、Bean のスコープが通常のスコープか疑似スコープかによって異なります。

  • 通常のスコープを持つ Bean への参照は、アプリケーションがハード参照を維持している限り有効です。ただし、通常のスコープに関連付けられたコンテキストがアクティブな場合にのみ呼び出すことができます。コンテキストが非アクティブのときに呼び出された場合、ContextNotActiveException がコンテナーによってスローされます。
  • 疑似スコープを持つ Bean への参照は、それが参照する Bean インスタンスが破棄されるまで有効です。疑似スコープに関連付けられたコンテキストがアクティブでない場合でも呼び出されることがあります。アプリケーションが、すでに破棄されているインスタンスへの参照のメソッドを呼び出す場合、動作は未定義です。

依存性注入を介してコンテナーから取得された Bean への参照は、注入された参照と呼ばれる特別な種類のコンテキスト参照です。挿入された参照の有効性には、追加の制限が適用されます。

  • フィールドに注入された Bean、Bean コンストラクター、初期化メソッドへの参照は、それが注入されたオブジェクトが破棄されるまでのみ有効です。
  • プロデューサーメソッドに挿入された Bean への参照は、プロデュースされているプロデューサーメソッドの Bean インスタンスが破棄されるまでのみ有効です。
  • ディスポーザメソッドまたはオブザーバメソッドに挿入された Bean への参照は、メソッドの呼び出しが完了するまでのみ有効です。
関連事項:
jakarta.enterprise.inject