パッケージ 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