🍃

java標準・Spring Boot アノテーションを図解で学ぶ

2024/10/30に公開

【java標準】
■ @Override
@Overrideは、親クラスやインターフェースのメソッドをサブクラスでオーバーライドしていることを明示します。

       親クラス(またはインターフェース)
                 │
                 ▼
 ┌────────────────────────────┐
 │  public void greet() {       │
 │      // 親クラスの処理        │
 │      System.out.println("Hello from Parent!"); │
 │  }                           │
 └────────────────────────────┘

                 ▲
                 │
                 │ サブクラスで再定義
                 │(オーバーライド)
                 ▼
 ┌────────────────────────────┐
 │ @Override                  │
 │ public void greet() {         │
 │     // サブクラスの処理        │
 │     System.out.println("Hello from Child!"); │
 │ }                            │
 └────────────────────────────┘

効果:オーバーライドされていることを明示し、間違ったメソッドシグネチャや名前の誤りをコンパイル時に検出可能にします。

■ @Deprecated
@Deprecatedは、クラスやメソッドが「非推奨」であることを示します。非推奨の要素は、将来のバージョンで削除される可能性があるため、他の推奨される方法を使用するように促されます。

┌──────────────────────────────┐
│  @Deprecated                 │
│ public void oldMethod() {    │
│     // 古い方法              │
│ }                            │
└──────────────────────────────┘

                │
                │
                ▼
          ┌───────────┐
          │ 新しいメソッド推奨 │
          │ newMethod()   │
          └───────────┘

効果:このメソッドやクラスを呼び出すと、使用を避けるよう警告が出されます。

■ @SuppressWarnings
@SuppressWarningsは、特定の警告を抑制するためのアノテーションです。指定した警告のみが抑制され、他の警告は通常どおり表示されます。

┌────────────────────────────────────────────┐
│  @SuppressWarnings("unchecked")            │
│  List list = new ArrayList();              │
│  list.add("unchecked 警告が抑制されます");      │
└────────────────────────────────────────────┘

効果:警告の抑制対象を指定し、警告メッセージを抑制します。

■ @SafeVarargs
@SafeVarargsは、可変長引数メソッドが型安全であることを示し、コンパイラに警告を抑制させます。Java 7で導入されました。

┌────────────────────────────────────────────┐
│  @SafeVarargs                              │
│  public static <T> void safeMethod(T... args) {│
│     // 型安全な操作                         │
│  }                                          │
└────────────────────────────────────────────┘

効果:ジェネリクスの可変長引数メソッドで非安全な操作の警告を抑制します。

■ @FunctionalInterface
@FunctionalInterfaceは、Java 8で導入されたアノテーションで、インターフェースが関数型インターフェース(1つだけ抽象メソッドを持つインターフェース)であることを示します。

┌──────────────────────────────┐
│ @FunctionalInterface         │
│ interface MyFunction {       │
│     void execute();          │
│ }                            │
└──────────────────────────────┘

効果:インターフェースが関数型インターフェースであることを明示し、抽象メソッドが1つのみでなければコンパイルエラーを発生させます。

■ @Documented
@Documentedは、アノテーションの情報をJavaDocに含めるよう指示するメタアノテーションです。

┌──────────────────────────────┐
│ @Documented                  │
│ public @interface ExampleAnn │
│ {                            │
│ }                            │
└──────────────────────────────┘

効果:このアノテーションを付けた他のアノテーションがJavaDocに自動的に記載されます。

■ @Inherited
@Inheritedは、アノテーションがサブクラスに継承されることを示すメタアノテーションです。

┌──────────────────────────────┐
│ @Inherited                   │
│ @interface CustomAnn {       │
│ }                            │
└──────────────────────────────┘

┌──────────────┐   ← 継承   ┌──────────────┐
│ 親クラス      │─────────▶ │ サブクラス     │
│ @CustomAnn   │           │ @CustomAnn    │
└──────────────┘           └──────────────┘

効果:アノテーションをクラスで継承する場合に使用します。

■ @Retention
@Retentionは、アノテーションの有効期間を指定するメタアノテーションで、SOURCE、CLASS、RUNTIMEのいずれかを指定します。

┌───────────────────────────────────────┐
│ @Retention(RetentionPolicy.RUNTIME)   │
│ public @interface CustomAnn {         │
│ }                                     │
└───────────────────────────────────────┘

効果:アノテーションの有効範囲を、ソースコード、バイトコード、または実行時のいずれかに限定します。
9. @Target
@Targetは、アノテーションの適用対象を制限するためのメタアノテーションで、TYPE(クラス)、METHOD(メソッド)などを指定します。

┌─────────────────────────────────────────────┐
│ @Target(ElementType.METHOD)                │
│ public @interface MethodOnlyAnn {          │
│ }                                          │
└─────────────────────────────────────────────┘

効果:アノテーションの適用先を制限し、適切な対象以外で使うとコンパイルエラーが発生します。

【Spring Boot アノテーション】
■ @Controller
@Controllerは、MVCのコントローラとして機能し、クライアントにHTMLレスポンスを返す際に使用されます。

          HTTPリクエスト
                │
                ▼
 ┌─────────────────────────────┐
 │ @Controller                 │
 │ └── HTMLページ返却用のコントローラ │
 └─────────────────────────────┘

概要:@Controllerは、クライアントにHTMLページを返すWebアプリケーションに用いられます。
使いどころ:HTMLビューを生成し、ページを返す際に付けます。REST APIには@RestControllerを使用します。

■ @RestController
@RestControllerは、REST APIを構築するためのコントローラで、JSONやXML形式でデータを返します。

          HTTPリクエスト
                │
                ▼
 ┌─────────────────────────────┐
 │ @RestController             │
 │ └── JSONデータ返却用のコントローラ │
 └─────────────────────────────┘

概要:@RestControllerは、REST APIを構築する際に使用され、@Controllerと@ResponseBodyを組み合わせた役割を持ちます。
使いどころ:APIエンドポイントを定義し、データをJSONやXMLで返却する際に付けます。

■ @Service
@Serviceは、ビジネスロジックを実装するサービスクラスに付けるアノテーションです。

             ┌───────────────┐
             │     @Service    │
             │  └─ ビジネスロジック層 │
             └───────────────┘
                   │
                   ▼
       ビジネスロジック(計算、データ加工など)

概要:@Serviceは、ビジネスロジックを持つクラスに付けて、DI(依存性注入)で他のクラスから利用できるようにします。
使いどころ:業務処理を行うサービスクラスやバックエンドのビジネスロジックを実装するクラスに付けます。

■ @Repository
@Repositoryは、データアクセス層(DAO層)で使用され、データベース操作の例外処理をサポートします。

             ┌───────────────┐
             │   @Repository   │
             │  └─ データアクセス層  │
             └───────────────┘
                   │
                   ▼
        データベースとのCRUD操作

概要:@Repositoryはデータベースへのアクセス処理を持つクラスに付け、Springが例外変換を行えるようにします。
使いどころ:データアクセス層(リポジトリ)に付け、データベース操作を行うクラスに使用します。

■ @Configuration
@Configurationは、Bean定義やアプリケーションの設定を行うクラスに付けます。

              ┌───────────────┐
              │ @Configuration │
              │ └─ 設定クラス     │
              └───────────────┘
                     │
                     ▼
           Bean定義 + 設定値の設定

概要:@Configurationは、アプリケーション設定やBean定義を行うクラスに付けるアノテーションです。
使いどころ:設定クラスや複数のBeanを管理するクラスに付けます。

■ @Component
@Componentは、DIコンテナに管理される汎用的なBeanを定義するために使用されます。

             ┌───────────────┐
             │  @Component    │
             │ └─ 汎用Beanの登録   │
             └───────────────┘
                     │
                     ▼
       コンポーネントスキャンで自動登録

概要:@Componentは、@Controllerや@Service、@Repositoryなどの特定の役割を持たない汎用的なBeanに使用します。
使いどころ:DIコンテナで管理したいが、特定のレイヤーに属さない汎用クラスに付けます。

■ @Autowired
依存性注入に関するアノテーション(@Autowiredと@Component)
@Autowiredは、依存関係を自動的に注入するためのアノテーションです。

┌──────────────┐      @Autowired         ┌──────────────┐
│  ServiceA    │ ────────────────────▶   │ RepositoryA  │
└──────────────┘                         └──────────────┘

概要:@Autowiredは、DIコンテナで管理されたBeanを他のクラスのフィールドやコンストラクタ、メソッドに注入します。
使いどころ:依存関係のあるBeanを必要とするクラスのフィールドやコンストラクタに付けます。

■リクエストマッピングアノテーション
(@RequestMapping、@GetMappingなど)

           HTTPリクエスト
                │
                ▼
 ┌────────────────────────────┐
 │  @RequestMapping            │
 │ └─── リクエストパスの指定     │ 
 └────────────────────────────┘
                │
  ┌────────────┴──────────────┐
  │                         │
  ▼                          ▼
@GetMapping             @PostMapping

概要:@RequestMappingはURLのパスに対応するメソッドを指定します。@GetMappingや@PostMappingは、特定のHTTPメソッドに対応したバージョンです。
使いどころ:HTTPリクエストのパスやメソッドごとに処理を振り分けたい場合に、コントローラーメソッドに付けます。

Discussion