【プログラミング】【java】Spring Bootで自前のアノテーションを作成する方法 - j-komatsu/myCheatSheet GitHub Wiki

Java Spring Bootで自前のアノテーションを作成する方法

1. はじめに

Spring Bootでは、@Autowired@RequestMapping など、さまざまなアノテーションが用意されています。
しかし、アプリケーションの要件に応じて 独自のアノテーション を作成することも可能です。

本ページでは、 自作アノテーションの作成方法を初学者向けと専門家向けに分けて解説 します。


2. プロジェクトのディレクトリ構成

自作アノテーションを作成する際の、基本的なディレクトリ構成を示します。

my-spring-boot-app/
├── src/main/java/com/example/annotation/
│   ├── ExecutionTime.java        # アノテーション定義
│   ├── ExecutionTimeAspect.java  # AOPによる処理
│   ├── LogExecution.java         # パラメータ付きアノテーション
│   ├── LogExecutionAspect.java   # ログ用のAOP処理
│
├── src/main/java/com/example/controller/
│   ├── TestController.java       # アノテーションを適用するテスト用コントローラー
│   ├── LogController.java        # ログ付きのテスト用コントローラー
│
├── src/main/resources/
│   ├── application.properties    # 設定ファイル
│
└── pom.xml                        # Mavenのビルドファイル

この構成では、com.example.annotation パッケージに アノテーション定義アスペクトクラス を配置し、 com.example.controllerテスト用のコントローラー を配置しています。

各コンポーネントの説明

  • アノテーション定義(ExecutionTime, LogExecution)

    • カスタムアノテーションを定義するクラス。
    • @interface を使用して作成し、@Retention で実行時に利用可能に設定。
    • 例: ExecutionTime.java, LogExecution.java
  • アスペクトクラス(ExecutionTimeAspect, LogExecutionAspect)

    • Spring AOP(Aspect Oriented Programming)を利用し、アノテーションを処理。
    • @Aspect を使用し、メソッド実行の前後にカスタム処理を追加。
    • 例: ExecutionTimeAspect.java, LogExecutionAspect.java
  • テスト用のコントローラー(TestController, LogController)

    • カスタムアノテーションを適用し、動作を確認するためのAPIを提供。
    • @RestController を使用し、HTTPリクエストを受け付ける。
    • 例: TestController.java, LogController.java

3. 初学者向け:基本の流れ

3.1 自作アノテーションの基本構成

自作アノテーションは Javaのアノテーション機能とSpringの機能 を組み合わせることで実装できます。

必要な要素

  1. アノテーションの定義@interface を使用)
  2. リフレクションを使って処理を実装AspectBeanPostProcessor を利用)
  3. Spring Bootアプリケーションで利用

3.2 簡単なアノテーションの作成

例えば、メソッドの実行時間を計測する @ExecutionTime というアノテーションを作ってみます。

1. アノテーションの定義

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecutionTime {
}
設定項目 説明
@Target(ElementType.METHOD) メソッドに適用できる
@Retention(RetentionPolicy.RUNTIME) 実行時にリフレクションで取得可能

2. アスペクトクラスの作成(AOPを使用)

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ExecutionTimeAspect {

    @Around("@annotation(ExecutionTime)")
    public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        System.out.println(joinPoint.getSignature() + " 実行時間: " + (end - start) + "ms");
        return result;
    }
}

6. まとめ

  • アノテーションはJavaの標準機能を活用して作成可能
  • AOPと組み合わせることで動的に処理を追加できる
  • 実行時間計測やログ出力などの用途に活用可能
  • 高度な使い方では、パラメータ付きアノテーションも作成できる

これで、Spring Bootでの 独自アノテーションの作成方法 を理解できたと思います!