 |

|
DIxAOPコンテナ「Seasar2とSpring」
|
第6回:Seasar2によるAOPの導入
著者:豆蔵 長谷川 裕一、竹端 進 2006/1/11
|
|
|
1 2 3 4 次のページ
|
 |
Seasar2のAOPについて
|
前回の第5回では、AOPの説明を行いました。今回は連載の「第3回:Seasar2の導入によるDIの実現」で作成した従業員管理WebアプリケーションにSeasar2のAOPを利用したトレースログの出力処理と例外処理の追加を行います。
今回AOPを使用して追加するトレースログの出力処理と例外処理は次のようになります。
- EmployeeManagerImplにSeasar2が提供するAdviceを用いたトレースログの出力処理と、独自実装の例外処理を追加します
- EmployeeS2Daoに独自実装のトレースログの出力処理を追加します
表1:例外処理
それでは、従業員管理Webアプリケーションにトレースログの出力処理と例外処理を追加する前にSeasar2のAOPについて解説しましょう。AOPの用語については連載の「第5回:AOPとは何か」を参考にしてください。
|
Seasar2のAOPのAdvice
|
Seasar2のAOPでは、次に示す3つのタイプのAdviceを使用します。
- Around Advice、Before Advice、After Advice、After Returning Advice
- それぞれ、Joinpointの前後・前・後に実行されるAdvice。これらは独自のAdviceとして実装する必要があります。
- Throw Advice
- Joinpointで例外が発生した場合に実行されるAdvice。Seasar2の提供するThrowsInterceptorを継承して実装する必要があります。
- その他のAdvice
- Joinpointに対する機能を実装済みのAdvice。Seasar2の提供するInterceptorをそのまま利用できます。
表2:Adviceのタイプ
なお、Seasar2のAOPの制約として表3に示す条件の場合には適用できませんので、注意してください。
- finalなクラスには適用不可
- finalあるいはstaticなメソッドには適用不可
表3:Seasar2のAOPの制約
それではそれぞれのAdviceについて解説しましょう。
|
Around Advice、Before Advice、After Advice、After Returning Advice
|
Around AdviceはJoinpointの前後に、処理を追加します。またBefore AdviceはJoinpointの前に、After AdviceはJoinpointの後に、After Returning AdviceはJointpointの正常終了後(例外が発生しない場合)に処理を追加します。
Seasar2ではいずれの場合でも、AOP Allianceが提供するインターフェースorg.aopalliance.intercept.MethodInterceptor(リスト1)を実装するか、org.seasar.framework.aop.interceptors.AbstractInterceptorの抽象クラスを継承して追加したい処理を記述します(リスト2)。
リスト2のinvocationオブジェクトは、AOPの対象として利用元から呼び出された本来のメソッドをあらわすクラスMethodInvocationです。このクラスMethodInvocationのメソッドproceedを呼び出すことで、本来呼び出されたメソッドを処理の中から呼び出すことができます。
proceedの前後に処理を追加したものがAround Adviceとなり、proceedの前、正常終了後、正常終了か否かを問わずに処理を追加したものがそれぞれBefore Advice、After Returning Advice、After Adviceとなります。
SpringのAOPではBefore Advice、After Returning Advice専用のインターフェースを用意していますが、Seasar2のAOPではMethodInterceptorをそのまま使用した方がよいというスタンスを取っているようです。
リスト1:MethodInterceptor
|
public interface MethodInterceptor extends Interceptor {
Object invoke(MethodInvocation invocation) throws Throwable;
}
|
リスト2:Around Adviceでの実装例
|
⁄⁄Adviceの定義(Joinpointで実行される振る舞い)
private class SpecialInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
⁄⁄メソッド呼び出し前の処理を記述
System.out.println("前処理");
⁄⁄実際のメソッド呼び出し
Object result = invocation.proceed();
⁄⁄メソッド呼び出し後の処理を記述
System.out.println("後処理");
return result;
}
(以下省略)
|

|
1 2 3 4 次のページ
|

|
|

|
著者プロフィール
株式会社豆蔵 長谷川 裕一
XMLの技術開発やCORBA、EJBを使用したシステム開発などを経て、現在はアジャイル開発プロセスの導入から工学的なソフトウエアプロセスの策定、オープンソースプロダクトに関するコンサルタント、アーキテクトとして常に第一線で活躍。共著として「プログラムの育てかた 現場で使えるリファクタリング(ソフトバンク)」、「Spring入門(技術評論社)」。
|

|
著者プロフィール
株式会社豆蔵 竹端 進
鉄鋼系SIerを経て現職に。現在はオープンソースプロダクトに関するコンサティング、開発支援、教育を行うチームに所属。日々、新たな技術をどのように生かしていくかを考える毎日。現在の注目対象はSeasar2とMaven。
|
|
|
|