はじめてのAOP

今日はAOPです。

Advice(MethodInterceptor)
→プログラム中に挿入されるコードを表します。Interceptorと呼ばれることもあります。


Joinpoint(MethodInvocation)
→対象となるクラスとAdviceを結合するポイントを表します。
 AdviceはJoinpointから引数やメソッドの情報を取得することができます。


Pointcut
→どこにJoinpointを設定するのかを定義します。


Aspect
→AdviceとPointcutを関連付けます。


InterType
→フィールドやメソッドの追加、実装するインタフェースの追加など,
 クラスの静的な構造を変更します。


いきなり知らない単語が羅列されるとびびります。
なんとなく、わかったような気になってみます。
でも、まったく実感わかないので、先に進みます。
# メリットだけは先に知ってたりします。。


で、設定例をみてみます。

<component class="java.util.Date">
    <aspect pointcut=".*">
        <component class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
    </aspect>
</component>


んー、ようわからん。。
TraceInterceptorのソースをみてみる。
なんかイロイロやってるけど、BEGINとENDが出力されるっぽい。


とにかく実装してみよ、、ということで。
こないだDIコンテナを動かしたときのソースに
↓を追加して、dionファイルに↑を追加する。

java.util.Date date = (Date) container.getComponent(Date.class);
System.out.println(date.getTime());


で、動かす。

DEBUG 2007-02-27 11:20:08,750 [main] S2Containerを作成します。path=study/dicon/BatchMain.dicon
DEBUG 2007-02-27 11:20:08,937 [main] S2Containerを作成しました。path=study/dicon/BatchMain.dicon
呼ばれました
いずれデータベースにアクセスします。。
WARN 2007-02-27 11:20:09,250 [main] java.util.Dateのメソッド(parse)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,328 [main] java.util.Dateのメソッド(UTC)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(getClass)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(wait)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(wait)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(wait)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(notify)にはアスペクトを適用できない修飾子が指定されています
WARN 2007-02-27 11:20:09,406 [main] java.util.Dateのメソッド(notifyAll)にはアスペクトを適用できない修飾子が指定されています
DEBUG 2007-02-27 11:20:09,406 [main] BEGIN java.util.Date#getTime()
DEBUG 2007-02-27 11:20:09,406 [main] END java.util.Date#getTime() : 1172542809406
1172542809406

なんかめっちゃワーニング。
Objectを継承したメソッドや、staticメソッドは
だーめよ、ってことなんでしょうか。


では、

にしてみます。

DEBUG 2007-02-27 11:25:03,187 [main] S2Containerを作成します。path=study/dicon/BatchMain.dicon
DEBUG 2007-02-27 11:25:03,390 [main] S2Containerを作成しました。path=study/dicon/BatchMain.dicon
呼ばれました
いずれデータベースにアクセスします。。
DEBUG 2007-02-27 11:25:03,640 [main] BEGIN java.util.Date#getTime()
DEBUG 2007-02-27 11:25:03,640 [main] END java.util.Date#getTime() : 1172543103640
1172543103640


なるほどねぇ。
にしても、kijimunaは便利っすねぇ。
今のプロジェクトでも、
XMLとソースコードを行ったり来たりするのが大変で。


こういうかゆいとこに手が届いてる感が魅力的です。