はじめに
Spring を学んでいると、
AOP(Aspect Oriented Programming:アスペクト指向プログラミング)
という言葉を目にすることがあります。
「DI はわかってきたけど、AOP はなんだか難しそう」
「ログやトランザクションが勝手に動くのはどういう仕組み?」
そんな疑問を持つ方も多いと思います。
この記事では、AOP を やさしく・実務で役立つ形 で整理していきます。
まずはコードを見て、そこから少しずつ理解していきましょう。
まずはコードを確認
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.demo.service.*.*(..))")
public void beforeMethod() {
System.out.println("メソッドが呼ばれました");
}
}このコードでは、service パッケージ内のメソッドが呼ばれる前に
ログを出力する処理が自動で挟み込まれます。
コードのしくみを解説
AOP とは
一言でいうと、
「共通処理を、必要な場所にそっと差し込む仕組み」
です。
アプリケーションには、
どのクラスでも必要になる“横断的な処理”があります。
- ログ出力
- トランザクション管理
- セキュリティチェック
- メトリクス取得
- キャッシュ処理
これらを各クラスに書くと、
コードが散らばり、保守が大変になります。
そこで登場するのが AOP です。
AOP がやっていること
AOP は、
「このメソッドが呼ばれたら、この処理を挟んでね」
というルールを定義し、Spring が裏側で実行してくれます。
AOP の基本用語を整理
Aspect(アスペクト)
横断的な処理をまとめたクラス。
ログやトランザクションなど。
Advice(アドバイス)
「いつ実行するか」を表す処理。
例:
- @Before(メソッドの前)
- @After(メソッドの後)
- @Around(前後どちらも)
Pointcut(ポイントカット)
「どのメソッドに適用するか」を表す条件。
例: execution(* com.example.demo.service.*.*(..))
JoinPoint(ジョインポイント)
実際に処理が差し込まれる場所。
あわせて知っておきたいポイント
Spring のトランザクションは AOP で動いている
@Transactional は AOP の代表例です。
メソッドの前後にトランザクション処理が自動で挟まれています。
ログやメトリクスも AOP と相性が良い
「どのメソッドでもログを出したい」
「処理時間を測りたい」
といった用途にぴったりです。
AOP は“魔法”ではなく“ルール”
AOP はコードを勝手に書き換えるわけではなく、
「この条件のときに、この処理を挟む」という
明確なルールに基づいて動いています。
使うときに気をつけたいこと
過度に使わない
AOP は便利ですが、使いすぎると
「どこで何が起きているのかわからない」
という状態になりがちです。
複雑な Pointcut は避ける
読みづらい条件式は、後から自分が困ります。
デバッグが難しくなることも
AOP は裏側で動くため、
ブレークポイントが思った場所で止まらないことがあります。
まとめ
AOP は、
「共通処理を必要な場所に自動で差し込む仕組み」
です。
- ログ
- トランザクション
- セキュリティ
- メトリクス
など、アプリ全体で必要になる処理を
きれいにまとめることができます。
難しく聞こえますが、
「横断的な処理をまとめるための仕組み」
と理解できれば十分です。

AOP は最初とっつきにくいですが、
理解が進むと「Spring がなぜ便利なのか」が一気に見えてきます。
あなたの開発が、今日より少しだけ楽になりますように。

必要なときにそっと処理を挟んでくれるなんて…Spring さん、気がきくね。

コメント