ひがやすを技術ブログ

電通国際情報サービスのプログラマ

ネストしたAspect

もうひとつはまってしまったことは,Aspectが適用されるのは,AOP Proxyを経由したメソッド呼び出しの場合だけということです.当然ですよね.でもはまっちゃいました.心より恥じる.今回テスト用に作ったFooとBarは,意味もなく自分のクラス(インスタンス)のメソッドを呼び出しています.この場合には,AOP Proxyを経由しないため,Aspectは適用されないんですね.このことになかなか気づくことが出来ませんでした.これって,意外と痛い制約にならないのでしょうか? ちょっとドキドキです.

Pointcutで指定したメソッド内からPointcutで指定している自分のメソッドを
呼び出したときに、Aspectが適用されるのかという問題。
S2はできます。


<component name="traceAdvice">
class="org.seasar.framework.aop.advices.TraceAdvice"/>

0
traceAdvice

の場合に、Date.hashCode()を呼び出すと

BEGIN java.util.Date#hashCode()
BEGIN java.util.Date#getTime()
END java.util.Date#getTime() : 0
END java.util.Date#hashCode() : 0
のようになり、ネストしてもAspectが適用されていることが分かると思います。
Springのソースを見ると、対象となるBeanのバイトコードを直接いじるのでは
なく、Beanの上にProxyをかぶせる形になっているので、
内部的に呼び出されるメソッドには、Aspectが適用されないようです。
あのSpringのロジックだと(たぶん)デフォルトコンストラクタのない
クラスにはAspectを適用できないんじゃないかなぁと思います。
http://d.hatena.ne.jp/higayasuo/20040221#p2