さっそく質問メールが届いた
JAVA PRESS Vol.41の特集2の第4章を担当したが,さっそく質問メールが届いた。内容は以下の通り。
ActionのexecuteをInterceptorすることはできたのですが、そのAction内で使用している、Bean等のメソッドをInterceptorしてログを注入する方法を探しています。いろいろためしてみたのですが、うまくできませんでしたので、もし参考になるサイトをご存知でしたら教えていただけたらと思い、メールしました。
上記の「Bean等のメソッド」がちょっと抽象的なので何とも言えないが,やりたいことはなんとなく想像できる。回答としては・・・
Spring AOPでは,オブジェクトAに対してオブジェクトBがInjectionされた場合,オブジェクトA内からオブジェクトBのメソッドを呼び出す箇所に対してのみ,アスペクトを適用することができる。
・・・ということになる。
これは,applicationContext.xmlでの記述内容を見れば,おのずと見えてくると思う。SpringのAOPは,あるオブジェクトをProxyFactoryBeanで包んであげることによって,そのオブジェクトのメソッドを外部から呼び出したときに,オブジェクトのメソッドの呼び出し前に動的に生成されたプロキシのメソッドが自動的に呼び出される,という仕組みになっている。それを踏まえると,Injectionされたメソッドをinterface越しで利用していた場合は,アスペクトを適用できるメソッドはそのinterfaceに定義されているメソッドに限定される,ということになる(ダウンキャストしたら・・・とかいう突っ込みはなやめてください)。
これに関しては,以下にも説明がある。
Spring Pad 「Pointcutその他」 Aspectが適用されるのは,AOP Proxyを経由したメソッド呼び出しの場合だけということです.
Spring AOPを使うときのちょっとした落とし穴なので,気をつけてほしい。