パッケージ jakarta.inject

アノテーションインターフェース Scope


スコープアノテーションを識別します。スコープアノテーションは、注入可能なコンストラクターを含むクラスに適用され、インジェクタが型のインスタンスを再利用する方法を制御します。デフォルトでは、スコープアノテーションが存在しない場合、インジェクターは(型のコンストラクターをインジェクトすることによって)インスタンスを作成し、そのインスタンスを 1 つのインジェクションに使用してから、それを忘れます。スコープアノテーションが存在する場合、インジェクターはインスタンスを保持して、後のインジェクションでの再利用の可能性があります。複数のスレッドがスコープインスタンスにアクセスできる場合、その実装はスレッドセーフである必要があります。スコープ自体の実装はインジェクターに任されています。

次の例では、スコープアノテーション @Singleton によって、Log インスタンスが 1 つだけあることが保証されます。

   @Singleton
   class Log {
     void log(String message) { ... }
   }

同じクラスで複数のスコープアノテーションまたはサポートしていないスコープアノテーションが検出されると、インジェクターはエラーを生成します。

スコープアノテーション:

  • @Scope@Retention(RUNTIME)、通常は @Documented でアノテーションが付けられます。
  • 属性を持つべきではありません。
  • 通常は @Inherited ではないため、スコープは実装継承と直交しています。
  • @Target でアノテーションを付けると、使用が制限される可能性があります。この仕様はスコープをクラスにのみ適用することをカバーしていますが、インジェクターの構成によっては、他の場所(ファクトリメソッドの結果など)でスコープアノテーションを使用する場合があります。

例:

   @java.lang.annotation.Documented
   @java.lang.annotation.Retention(RUNTIME)
   @jakarta.inject.Scope
   public @interface RequestScoped {}

@Scope でスコープアノテーションを付けると、プログラマーがクラスのスコープアノテーションを使用したが、インジェクターでスコープを構成するのを忘れた場合をインジェクターが検出できます。保守的なインジェクターは、スコープを適用しないのではなく、エラーを生成します。

関連事項: