Spring Boot入門〜SpringAOP編〜
本記事は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