springframework AOPについて
AOP(Aspect Oriented Programming)
「アスペクト指向プログラミング」:各クラスで共通する処理を抜き出して、まとめて管理する。
ん、どんな事?
【例】
public void doHogehogeTypeA() {
System.out.println("doHogehogeTypeA:開始");
(中略)
System.out.println("doHogehogeTypeA:終了");
}
public void doHogehogeTypeB() {
System.out.println("doHogehogeTypeB:開始");
(中略)
System.out.println("doHogehogeTypeB:終了");
}
各メソッドに開始と終了にログ出力を入れたりすると、修正や入れ忘れが発生する可能性がある。
こう言った時に、共通処理をまとめたりするのがAOPである。
その共通処理をどのクラスのどのメソッドに適用するかを選択することができる。
AOPで管理できる代表的なもの。。。。
- ログ出力
- セキュリティ
- トランザクション
- 例外処理
- キャッシュ
- リトライ
といった感じで他にもある。
オブジェクト指向では、各オブジェクトに共通の処理を割り当てるのは難しい。
それを出来るようにしたのが、AOPとなる。
Advice:AOPで実行する処理
Pointcut:処理を実行する場所(ClassとかMethod)
JoinPoint:処理タイミング
JoinPoint
Before:メソッドが実行される前に、AOP処理(advice)を実行
After:メソッドが実行された後に、AOPの処理(Advice)を実行
AfterReturning:メソッドが正常終了した場合だけ、AOPの処理(Advice)を実行
AfterThrowing:メソッドが異常終了した場合だけ、AOPの処理(Advice)を実行
Around:メソッドの実行前後に、AOPの処理(Advice)を実行
◆AOPの仕組み
DIコンテナに登録されているクラス(Bean)のメソッドを呼び出そうとします。
しかし、Beanのメソッドを直接呼び出しているわけではなく。
Proxyが自動生成されていて、Proxy経由でBeanメソッドが呼び出されています。
そのBeanメソッドの呼び出しの前後に、Advice(AOPの処理)が実行される。
インターネット接続のProxyとは違うので間違いなく。
ここでは代理といった感じ。
まぁ、代理といってもピンとこないがとりあえず、自動で生成されたProxyを経由してBeanメソッドが呼び出されます。
◆AOPの作り方
- AOPのクラスには、@Aspectと@Componentをつける
- AOPクラスのメソッドには、JoinPoint(実行タイミング)のアノテーションをつける
- JoinPointのアノテーション内に、Pointcut(実行場所)を指定する
◆Pointcut(実行場所)の指定
- JointPoint(実行タイミング)のアノテーションの中にPointcut(実行場所)を設定
- execution(<戻り値> <パッケージ名>.<クラス名>.<メソッド名>(<引数>)
- bean(<Bean名>)
- @annotation(<パッケージ名>.<アノテーション名>)
- @within(<パッケージ名>.<アノテーション名>)