 |

|
DIxAOPコンテナ「Seasar2とSpring」
|
第6回:Seasar2によるAOPの導入
著者:豆蔵 長谷川 裕一、竹端 進 2006/1/11
|
|
|
前のページ 1 2 3 4 次のページ
|
 |
Throw Advice
|
Throw AdviceはJoinpointで発生した例外に対する例外処理を追加したいときに利用します。
Throw Adviceを作成するには、クラスorg.seasar.framework.aop.interseptors.ThrowsInterceptorを継承したクラスの実装として例外処理を記述します。ThrowsInterceptorを継承したクラスには、メソッド"handleThrowable(Throwable, MethodInvocation)"を実装します。引数のThrowableにはThrowableのサブクラスを指定することができます。
例えばメソッド"handleThrowable(NullPointerException, MethodInvocation)"を定義すると、JoinpointでNullPointerExceptionもしくはNullPointerExceptionのサブクラスの例外が発生した場合に呼び出されます。またメソッド"handleThrowable(Throwable, MethodInvocation)"は、ThrowsInterceptorを継承したクラスの中に複数個定義することができます。
Seasar2のAOPは、記述されたメソッドのパラメータに定義された例外の型を参照してJoinpointで発生した例外を適切に振り分けてくれます。継承関係にある例外を指定したメソッドが同じクラス内に定義されている場合でも、発生した例外から基底となるクラスにさかのぼって振り分けを行います。そのため、try-catchで例外を判定する場合のようにメソッドの順序を気にする必要がありません。
リスト3:メソッドhandleThrowableの定義
|
public void handleThrowable(Throwable t, MethodInvocation invocation)
throws Throwable {
}
|
リスト4:Throw Adviceの実装例
|
public class HandleThrowableInterceptor extends ThrowsInterceptor {
public void handleThrowable(NullPointerException t, MethodInvocation invocation)
throws Throwable {
System.out.println("NullPointerExceptionの例");
throw t;
}
public void handleThrowable(IllegarArgumentException t, MethodInvocation invocation)
throws Throwable {
System.out.println("IllegarArgumentExceptionの例");
throw t;
}
}
|
 |
Seasar2で提供されるその他のAdvice
|
Seasar2のAOPでは、よく使用される機能をあらかじめ実装したInterceptorが提供されています。ここでは、TraceInterceptor、DelegateInterceptor、InterceptorChainの3つを取り上げます。
|
TraceInterceptor
|
org.seasar.framework.aop.interceptors.TraceInterceptorは、トレース処理を扱うためのAdviceです。簡易に処理内容を知りたい時に便利です(リスト5)。
|
リスト5:TraceInterceptorの例
|
<component name="traceInterceptor"
class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
<component class="java.util.ArrayList>
<aspect>traceInterceptor</aspect>
</component>
<component class="java.util.Date">
<arg>0</arg>
<aspect pointcut="getTime, hashCode">
traceInterceptor
</aspect>
</component>
|
下記はトレースの出力例です。
|
DEBUG 2005-12-31 14:23:58,380 [main] BEGIN aopsample.SampleImpl#method()
DEBUG 2005-12-31 14:23:58,388 [main] END aopsample.SampleImpl# method() : 結果
|
 |
DelegateInterceptor
|
DelegateInterceptorは、メソッドの呼び出しを別のクラスに委譲するためのAdviceです。org.seasar.framework.aop.interceptors.DelegateInterceptorを利用して、targetプロパティに委譲したい相手を指定します。targetプロパティの指定はメソッド"setTarget"で設定します。
リスト6の定義例では、抽象クラスAbstractSampleに対してDelegateInterceptorのメソッド"setTarget"を使用して実装クラスSampleImplを設定しています。使用例の呼び出しを行いmethodが処理を行います。
リスト6:DelegateInterceptorの定義例
|
⁄⁄ diconファイルの定義例
<component class="AbstractSample">
<aspect>
<component class="org.seasar.framework.aop.interceptors.DelegateInterceptor">
<initMethod name="setTarget">
<arg>new SampleImpl()</arg>
<⁄initMethod>
<⁄component>
</aspect>
</component>
⁄⁄ 使用例
⁄⁄ 呼び出し元のプログラム
Sample sample = (Sample) container.getComponent(AbstractSample.class);
sample.method();
|
 |
InterceptorChain
|
InterceptorChainは、複数のAdviceをグループ化し、再利用しやすくするためのAdviceです。org.seasar.framework.aop.interseptors.InterceptorChainを利用して、複数のAdviceを指定して使用します(リスト7)。
処理の実行順序は先に登録したAdviceが先に実行されます。Around Adviceの実装をA、Bの順に登録した場合、「AのBefore処理 → BのBefore処理 → AOPを適用したメソッドの呼び出し → BのAfter処理 → AのAfter処理」という順番になります。
リスト7:InterceptorChainの例
|
<component name="traceInterceptor" class="TraceInterceptor"/>
<component name="throwsInterceptor" class="SampleThrowsInterceptor"/>
<component name="chain" class="org.seasar.framework.aop.interceptors.InterceptorChain">
<initMethod name="add"><arg>traceInterceptor</arg></initMethod> 
<initMethod name="add"><arg>throwsInterceptor</arg></initMethod> 
</component>
<component class="SampleImpl">
<aspect pointcut=".*">chain</aspect>
</component>
|
 |
前のページ 1 2 3 4 次のページ
|

|
|

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

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