[[Spring-MVC/ステップ・バイ・ステップ]] 2008/04/15からのアクセス回数 &counter; #contents ** AOPの用語の説明 [#o8eec54f] AOPでは、聞き慣れない用語がたくさん出てきます。 ここでは、それらを簡潔に説明し、SpringでのAOPの特徴について説明します。 *** Aspect [#o51c30c3] Aspectとは、adviceとjoinpointの組み合わせを指定するモジュール単位です。 *** Advice [#t2a184d0] Adviceとは、pointcutによって指定されたjoinpointのどのタイミングで、どのような処理を 行うかを定義したものです。 *** Joinpoint [#m8175767] Joinpointとは、プログラムの実行時にAdviceの割り込ませることが可能なコード上の位置を示します。 *** Pointcut [#h8425eec] Pointcutでは、adviceを適応するjoinpointの条件を指定します。 *** SpringでのAOPの特徴 [#b7ec72e7] pringのAOPは、プロキシーを使ってメソッドへの呼び出しを横取りするInterceptorとコンテナーのどの部分にInterceptorを適応するかを指定するAdvisorから構成されています。 従って、Springでは、fieldにはAspectを適応できません。 Spring でサポートされている adivceの種類を以下に示します。 | adivceの種類 | インタフェース | 適応箇所 | | Before | org.springframework.aop.BeforeAdvice | メソッドが呼び出される前 | | After-returing | org.springframework.aop.AfterReturningAdvice | リターンの直前 | | After-throwing | org.springframework.aop.ThrowsAdvice | 例外を発行する直前 | | Around | org.aopalliance.intercept.MethodInterceptor | メソッド呼び出しを横取りする | | Introduction | org.springframework.aop.IntroductionInterceptor | Interceptorを使って新たなInterfaceを導入する | ** ログ出力のAdvice [#p9989823] 各メソッドの入り口と出口でログを出力するAOPを例にSpringのAOPについて説明します。 最初に各メソッドの呼び出し前とリターン直前にログを出力する EnterMethodLogAdvice と LeaveMethodLogAdvice を作成します。 *** EnterMethodLogAdvice [#de89046f] メソッド呼び出し前の Advice(Before Advice)は、 インタフェース MethodBeforeAdvice を実装しなくてはなりません。 EnterMethodLogAdviceは、以下のようになります。 #pre{{ public void before(Method method, Object[] args, Object target) throws Throwable { System.out.print("enter " + method.getName() + " args=("); if (args != null) { for (int i = 0; i < args.length; i++) { if (i != 0) System.out.print(", "); System.out.print(args[i]); } System.out.println(")"); } } }} *** LeaveMethodLogAdvice [#s4e4f28d] 同様に、メソッドリターン直前の Advice(After Advice)は、 インタフェース AfterReturningAdvice を実装しなくてはなりません。 LeaveMethodLogAdviceのソースを以下に示します。EnterMethodLogAdviceと同様にメソッド名とリターン値を出力します。 #pre{{ public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("leave " + method.getName() + " return=" + (returnValue != null ? returnValue : "null")); } }} ** Pointcut [#ta87f751] Springでは、Pointcutを正規表現で指定するJdkRegexpMethodPointcutを提供しています。 これを使ってorg.springframework.showcase.coverc.web以下のすべてのメソッドにpointcutを 定義すると以下のようになります。 #pre{{ }} ** Advisor [#qf6bbc80] ** コメント [#l056f56b] この記事は、 #vote(おもしろかった,そうでもない,わかりずらい) 皆様のご意見、ご希望をお待ちしております。 #comment