カテゴリ: Micronaut 更新日: 2026/02/22

MicronautのAノテーションで独自処理を追加する方法!自作AOPの作り方

MicronautのAノテーションで独自処理を追加する方法!自作AOPの作り方
MicronautのAノテーションで独自処理を追加する方法!自作AOPの作り方

先生と生徒の会話形式で理解しよう

生徒

「Micronautで自分だけのアノテーションを作ってメソッドの前後で特別な処理を挟むことはできますか?」

先生

「はい、Micronautでは独自のアノテーションを定義して、AOPのInterceptorに結び付けることで、任意の処理を自動で実行できます。」

生徒

「具体的にはどうやって作るんですか?」

先生

「基本の流れをステップごとに見ながら解説します。順番に理解していきましょう!」

1. 独自アノテーションの作り方

1. 独自アノテーションの作り方
1. 独自アノテーションの作り方

まずは自分のメソッドに付与するアノテーションを作ります。@Retentionと@Targetを設定して、どの範囲でアノテーションを使うか決めます。そして@AroundでInterceptorを指定することで、アノテーションを付けたメソッドに自動的に処理を挟めます。


import io.micronaut.aop.Around;
import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
@Around(TimingInterceptor.class)
public @interface Timed {
}

2. Interceptorクラスの作成

2. Interceptorクラスの作成
2. Interceptorクラスの作成

InterceptorクラスはMethodInterceptorインターフェースを実装して作ります。メソッドの前後で処理を挟むために、context.proceed()の前後に必要な処理を書きます。DIを使えば他のBeanも利用可能です。


import io.micronaut.aop.MethodInterceptor;
import io.micronaut.aop.MethodInvocationContext;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

@Singleton
public class TimingInterceptor implements MethodInterceptor<Object, Object> {

    @Inject
    private LoggingService loggingService;

    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {
        long start = System.currentTimeMillis();
        Object result = context.proceed();
        long end = System.currentTimeMillis();
        loggingService.log(context.getMethodName() + "の実行時間: " + (end - start) + "ms");
        return result;
    }
}

3. BeanをInterceptorで活用する

3. BeanをInterceptorで活用する
3. BeanをInterceptorで活用する

Interceptor内では@Injectを使って他のBeanを注入できます。これにより、ロギングや通知、監査などの共通処理を再利用可能なサービスとしてInterceptor内で利用できます。


import jakarta.inject.Singleton;

@Singleton
public class LoggingService {
    public void log(String message) {
        System.out.println("ログ: " + message);
    }
}

4. 独自アノテーションをメソッドに適用

4. 独自アノテーションをメソッドに適用
4. 独自アノテーションをメソッドに適用

作成した@Timedアノテーションを対象のメソッドに付与します。Interceptorが自動的に処理を挟むため、メソッド側の実装を変更する必要はありません。


import jakarta.inject.Singleton;

@Singleton
public class UserService {

    @Timed
    public void createUser(String username) {
        System.out.println(username + "を作成しました");
    }
}

5. 複数Interceptorの活用例

5. 複数Interceptorの活用例
5. 複数Interceptorの活用例

複数のInterceptorを組み合わせることもできます。例えば、TimingInterceptorとSecurityInterceptorを同じメソッドに適用して、処理時間計測とアクセス制御を同時に行えます。Interceptorは呼び出し順に実行されます。


@Singleton
public class SecurityInterceptor implements MethodInterceptor<Object, Object> {

    @Inject
    private AuthService authService;

    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {
        if (!authService.isAllowed(context.getMethodName())) {
            throw new SecurityException("アクセス拒否: " + context.getMethodName());
        }
        return context.proceed();
    }
}

6. 実務での活用ポイント

6. 実務での活用ポイント
6. 実務での活用ポイント

自作AOPを活用すると、メソッドごとの共通処理を一元管理できます。ログ、監査、セキュリティ、通知などをInterceptorでまとめることで、コードの保守性と再利用性が向上します。独自アノテーションを作ると、プロジェクト全体で統一的に処理を挿入できます。

7. 注意点とベストプラクティス

7. 注意点とベストプラクティス
7. 注意点とベストプラクティス

Interceptorを多用しすぎると処理の追跡が難しくなる場合があります。特に複数Interceptorを重ねる場合は順序や副作用に注意してください。また、Interceptor内では例外処理を適切に行い、メソッド本体の処理を邪魔しないように設計することが重要です。

カテゴリの一覧へ
新着記事
New1
Micronaut
Micronautの@Factoryとは?複雑なBean生成を管理するための方法を解説
New2
Quarkus
QuarkusのDIとCDIを完全理解!@Producesでプロデューサーメソッドを使う方法を初心者向けに解説
New3
Java
JavaのStringBufferクラスを徹底解説!スレッド安全な文字列操作の仕組みと使い分け
New4
Micronaut
Micronautで非同期HTTP処理を行う方法!リアクティブ対応の基礎知識
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.2
Java&Spring記事人気No2
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.3
Java&Spring記事人気No3
Quarkus
QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
No.4
Java&Spring記事人気No4
Micronaut
Micronautのルーティング設定ガイド!プレフィックス付与とAPIバージョニングの基本
No.5
Java&Spring記事人気No5
Micronaut
Micronautのフィルタ徹底解説!HTTPリクエスト共通処理をスマートに追加する方法
No.6
Java&Spring記事人気No6
Java
Java Optional ifPresentの使い方を徹底解説!nullチェックをスマートに省略する方法
No.7
Java&Spring記事人気No7
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.8
Java&Spring記事人気No8
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?