AOPの記述方法

AOPの記述に当たっては、行うことが2つあります

  1. 割り込ませる処理を作成する( Adviceの作成 )
  2. どこに割り込ませるかを設定する( PointCutの設定 )

割り込ませる処理を作成する( Adviceの作成 )

最初に、LoginCtrlの onSubmit()メソッドに処理を割り込ませるクラス( Advice )を実装します。
と言いたいところなのですが、割り込むメソッドは、handleRequest()になります。

SpringFrameworkは、interfaceで定義したメソッドしか、AOPの対象にできないという制約があります
LoginCtrlクラスの継承元の SimpleFormController が実装しているinterfaceは
org.springframework.web.servlet.mvc.Controller なのですが、ここには onSubmit() はありません。

ということで、残念ながら POST で発動する onSubmit() には、AOPを仕掛けることができません。
代わりに onSubmit() の内部からコールされる org.springframework.web.servlet.mvc.Controller.handleRequest()
にAOPを仕掛けることにします。

com.jxpath.springweb.login パッケージに、以下の CrackerLogger.java を追加します。
実装上のポイントを列挙しておきます。

  • Advice は org.aopalliance.intercept.MethodInterceptor を implementsする
  • invokeの引数 aInvocationは、割り込む対象の メソッド( handleRequest )の情報を持つ
  • handleRequest()の引数一覧は aInvocation.getArguments() で取得できる
  • handleRequest()そのものを実行する時は aInvocation.proceed() を呼び出す

どこに割り込ませるかを設定する( PointCutの設定 )

AdviceをBean登録

最初に、先ほどの CrackerLogger を Bean として 設定ファイルに登録します。
BaseBean.xml に以下の記述を追加してください。

PointCutをBean登録

今度は PointCut を登録します。PointCutとは、簡単に言えば、「どのメソッドに」「どのAdvice」を適用するか
を宣言することだと考えれば良いかと思います。
今度は SpringWeb2-servlet.xml に以下の記述を追加してください。

少し説明します。
id="crackerAdvisor" は handleRequestというメソッドに、crackerLogger というAdviceを適用しろ、という
意味になります。
id="loginCtrlAop" は、id="loginCtrl"が org.springframework.web.servlet.mvc.Controller をimplementsした
メソッド群( この場合は handlerRequestのみです )に、id="crackerAdvisor" を適用して、id="loginCtrl"を
パワーアップした id="loginCtrlAop" を作成するという意味です。

login時の判定Beanを変更

最後に、以前に SpringWeb2-servlet.xml に 記述済みの 下記の箇所で、loginCtrl を loginCtrlAopに書き直します。

実行します

では、SpringWeb2 を mvn package して、実行後、http://localhost:8080/SpringWeb2/ で、
アカウント名に root を指定してみてください。
Tomcatの標準出力( 下図では Eclipse の Console ) に「root request from 127.0.0.1」と表示され、
CrackerLogger が稼動していることが確認できると思います。