パッケージ jakarta.inject

アノテーション型 Scope


  • @TargetSE(ANNOTATION_TYPESE)
    @RetentionSE(RUNTIMESE)
    @DocumentedSE
    public @interface 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 でスコープアノテーションを付けると、プログラマーがクラスのスコープアノテーションを使用したが、インジェクターでスコープを構成するのを忘れた場合をインジェクターが検出できます。保守的なインジェクターは、スコープを適用しないのではなく、エラーを生成します。

    関連事項:
    @Singleton