Jakarta EE 10 - Jakarta Annotations 2.1 変更内容まとめ

blog1.mammb.com


はじめに

Jakarta Annotations (旧 Common Annotations) は、他の仕様で使用可能な共通のアノテーションの小さなセットを定義しています。

これにより、他のJakarta EE仕様で独自定義されたアノテーションの冗長性や重複を回避することで、プラットフォーム間で使用するアノテーションに一貫性をもたせるものとなります。

Jakarta Annotations 2.1 では、いよいよ @Nonnull @Nullable が追加されました。それと @Priority の定義変更が含まれます。

以下に見ていきましょう。


jakarta.annotation.Nonnull / Nullable の追加

Nonnull アノテーションはnull になり得ない要素をマークするために使用されます。 Nullable アノテーションは、null になる可能性のある要素をマークするために使用されます。

これらのマーカーアノテーションは、IDEや静的解析ツール、およびランタイム検証で使用されることを想定しています。

Jakarta Annotations 仕様では、以下の動作を定義しています。

  • メソッド - 戻り値の型は null であってはならない / null の可能性がある
  • パラメータ - パラメータは null であってはならない / null の可能性がある
  • フィールド - オブジェクトの構築完了後、フィールドを null にできない / null の可能性がある
public interface StockQuoteService {
    @Nonnull
    BigDecimal quote(
        @Nonnull String marker,
        @Nullable BigDecimal defaultValue);
}


jakarta.annotation.Priority アノテーション適用範囲の拡大

Priority アノテーションは、プログラム要素に適用して、それらがどのような順序で使用されるべきかを指定するものです。 Priority アノテーションを特定のインスタンスで使用した場合の効果は、特定のクラスの使用を定義する他の仕様によって定義されます。

jakarta.annotation.Priority アノテーションは、今まで @Target({TYPE, PARAMETER}) とマークされており、型とパラメータにのみ適用可能となっており、プロデューサーメソッド/フィールドへの付与ができませんでした。

旧来は以下のような定義だったものが、

@Target({TYPE, PARAMETER})
@Retention(RUNTIME)
@Documented
public @interface Priority {
     int value();
}

以下のように変更されました。

@Retention(RUNTIME)
@Documented
public @interface Priority {
     int value();
}

@Target メタ注釈が存在しないため、型パラメータ宣言を除く任意の宣言の修飾子として記述できるようになりました。

CDI 4.0 の変更点で、ステレオタイプに @Priority で優先度指定が可能となったこととも関連しています。


その他の変更の無いアノテーション

以下のアノテーションについては旧来から変更はありません。

  • jakarta.annotation.Generated
  • 生成されたソースコードをマークするために使用

  • jakarta.annotation.Resource / Resources

  • アプリケーションの初期化時に、コンテナが要求されたリソースのインスタンスをアプリケーションに注入

  • jakarta.annotation.PostConstruct / PreDestroy

    • PostConstruct アノテーションは、依存性注入が行われた後に実行される必要があるメソッドで使用
    • PreDestroy アノテーションは、インスタンスがコンテナから削除される過程にあることを知らせるコールバック通知として使用メソッドで使用
  • jakarta.annotation.security.RunAs

    • Jakarta EE コンテナでの実行中のアプリケーションのセキュリティロールを定義
    • 特定のロールの下でアプリケーションを実行することが可能
  • jakarta.annotation.security.RolesAllowed

    • アプリケーションのメソッドにアクセスすることを許可されたセキュリティロールを指定
  • jakarta.annotation.security.PermitAll

    • すべてのセキュリティ・ロールが指定されたメソッドの呼び出しを許可されることを指定
  • jakarta.annotation.security.DenyAll

    • どのセキュリティ・ロールも指定されたメソッドを呼び出すことができないことを指定
  • jakarta.annotation.security.DeclareRoles

    • アプリケーションで使用されるセキュリティロールを指定する
  • jakarta.annotation.sql.DataSourceDefinition / DataSourceDefinitions

    • JNDI に登録されるコンテナ DataSource を定義
  • jakarta.annotation.ManagedBean

    • Jakarta Managed Bean を宣言するために使用される。
    • リソースインジェクション、ライフサイクルコールバック、インターセプターなどの基本サービスの小さなセットをサポートするコンテナ管理オブジェクト