[[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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc