👻

Spring Boot入門〜SpringAOP編〜

2023/02/24に公開

本記事はChatGPTで出力した内容を修正して投稿しています。

AOP(アスペクト志向プログラミング)とは

オブジェクト指向の一種で、"関心の分離"を実現するための技術の一つです。

AOP では、プログラムの処理を機能ごとに分けずに、横断的な関心事 (cross-cutting concern) と呼ばれる処理を横断的に取り扱うことで、関心事の分離を実現します。例えば、ログ出力、トランザクション管理、認証処理、例外処理などが横断的な関心事にあたります。

AOP では、これらの横断的な処理をアスペクト (Aspect) として定義し、オブジェクトのメソッド呼び出しの前後や、メソッド内で例外が発生した場合など、特定のポイントでアスペクトを適用することで、関心事の処理を実現します。

AOP は、コードの可読性や保守性を向上させるとともに、処理の再利用性も高めることができます。主な実装として、Spring AOPなどがあります。

Spring AOPの実装例

例えば、アプリケーションで処理時間のログを取る場合を考えます。この場合、各メソッドの処理時間を計測するAdviceを作成し、各メソッドに適用します。

まず、Adviceを定義します。Adviceは、@Aroundアノテーションを付けたメソッドで実装します。このメソッド内で、対象のメソッドを呼び出し、処理時間をログ出力します。

@Aspect
@Component
public class LoggingAspect {

    @Around("execution(* com.example.demo.service.*.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();

        Object proceed = joinPoint.proceed();

        long executionTime = System.currentTimeMillis() - startTime;
        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");

        return proceed;
    }
}

次に、Pointcutを定義します。Pointcutは、@Pointcutアノテーションを付けたメソッドで実装します。このメソッド内で、Adviceを適用する対象のメソッドを指定します。

@Aspect
@Component
public class LoggingAspect {

    @Pointcut("execution(* com.example.demo.service.*.*(..))")
    public void serviceLayer() {}

    @Around("serviceLayer()")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        // Adviceの実装
    }
}

最後に、アプリケーションでSpring AOPを有効化するために、@EnableAspectJAutoProxyアノテーションを付けた@Configurationクラスを作成します。

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // その他のBean定義など
}

これで、LoggingAspectが適用され、対象のメソッドの処理時間がログ出力されます。

Discussion