アスペクト

アスペクトについて

SimpleController4Jでは、リクエストパス・HTTPメソッドに応じて、フロントコントローラ(DispatcherServlet) が実行するメソッドを決定して、処理のディスパッチを実行します。
ディスパッチ先の実行メソッドの以下のポイント(タイミング)をジョンインポイント(JoinPoint)として、 処理を挿入することが出来ます。

  • メソッド実行前(@Before)
  • メソッド実行後(@After)
  • メソッド実行前後(@Around)
  • メソッドリターン後(@AfterReturning)
  • 例外スロー後(@AfterThrowing)
挿入処理は全てのジョインポイントで実行されるのではなく、各ジョインポイントを表すアノテーション (@Before/@After/@Around/@AfterReturning/@AfterThrowing)と、このアノテーションの execution属性に指定したフィルタリング条件(フィルターカット)に該当するメソッド(挿入処理: アドバイス)が実行されます。

@Aspectアノテーション

SimpleController4Jで、挿入処理を記述したアスペクト(Aspect)と認識されるためには、 @Aspectアノテーションをクラスに記述します。
例としては以下のようになります。

/**
 * アスペクトサンプル
 */
@Aspect
public class SampleAspect {
	〜 メソッド定義など 〜
}

execution属性

各ジョインポイントアノテーション(@Before/@After/@Around/@AfterReturning/@AfterThrowing)には、 execution属性を指定することが出来ます。
このexecution属性に指定したメソッドが実行される場合に、挿入処理が実行されます。
execution属性は以下の指定が可能です。

  • クラス完全修飾名 + メソッド名
  • ワイルドカード指定

まず、基本的な指定方法は「クラス完全修飾名 + メソッド名」となります。
以下は、コントローラクラスとメソッドを完全修飾名で指定する例です。
「controller.SampleController」クラスの「getMethod」メソッドが実行される前に、 アドバイスが実行されます。

/**
 * アスペクトサンプル
 */
@Aspect
public class SampleAspect {

	@Before(execution = "controller.SampleController.getMethod")
	public void beforeGet(ServletResponse response) throws IOException {
		PrintWriter out = ((HttpServletResponse) response).getWriter();
		out.println("before aspect execute!");
	}
}
■ 実行結果
CW-02:~ XXX$ curl localhost:8080/SimpleControllerSample/sample/get
before aspect execute!
getMethod get execute!

次に「ワイルドカード指定」の方法ですが、「ワイルドカード:*」を指定した箇所は任意となり、 その他の指定部分にマッチするクラス・メソッドが実行される時に、アドバイスが実行されます。
以下は、複数のコントローラクラスの「init」メソッドが実行される後に、アドバイスが実行されます。

/**
 * アスペクトサンプル
 */
@Aspect
public class SampleAspect {

	@After(execution = "*.init")
	public void afterInit(ServletResponse response) throws IOException {
		PrintWriter out = ((HttpServletResponse) response).getWriter();
		out.println("after aspect execute!");
	}
}
■ 実行結果
CW-02:~ XXX$ curl localhost:8080/SimpleControllerSample/sample/init
init execute!
after aspect execute!

同じアドバイスを複数の実行メソッド(ディスパッチメソッド)で実行したい場合があると思います。
そのような場合は、execution属性を複数設定することが出来ます。
以下は、複数のコントローラクラスの「postMethod」メソッド・「aroundMethod」メソッドが 実行される前後に、アドバイスが実行されます。

/**
 * アスペクトサンプル
 */
@Aspect
public class SampleAspect {

	@Around(execution = {"*.postMethod", "*.aroundMethod"})
	public void around(ServletRequest request, ServletResponse response) throws IOException {
		PrintWriter out = ((HttpServletResponse) response).getWriter();
		out.println("around aspect execute!");
	}
}
■ 実行結果
CW-02:~ XXX$ curl -X POST localhost:8080/SimpleControllerSample/sample/post
around aspect execute!
postMethod post execute!
around aspect execute!
CW-02:~ XXX$ curl localhost:8080/SimpleControllerSample/sample/around
around aspect execute!
aroundMethod get execute!
around aspect execute!

アドバイスの引数

アドバイスメソッドには以下のパラメータを指定可能です。

  • ServletRequest
  • ServletResponse
ServletRequest・ServletResponseはフィルターの引数ですので、サーブレット感覚で処理を記述することが出来ます。
アスペクトをフィルターと同じ感覚で記述することが可能です。
上記2つの引数は省略することも可能です。

ご意見・ご感想・バグ報告

×

SimpleController4Jへのご意見やご感想がございましたら、メッセージをお願い致します。
また、SimpleController4Jを使用して頂きまして、バグがございましたらご連絡を頂けると助かります。
皆様からのご意見・ご感想をもとに、SimpleController4Jを改善・拡張をしていきたいと考えております。
皆様からのメッセージは当方で確認をしておりますが、仕事をしながらの開発となる為、すぐにご返信・対応をすることが 出来ない場合がございます。何卒ご容赦ください。

※印は必須です
タイトル
メールアドレス
内容