【プログラミング】【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の機能 を組み合わせることで実装できます。
必要な要素
- アノテーションの定義(
@interface
を使用) - リフレクションを使って処理を実装(
Aspect
やBeanPostProcessor
を利用) - 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での 独自アノテーションの作成方法 を理解できたと思います!