AspectJのcallとexecution

今までよく意味を知らないままexecutionだけ使ってましたが、アスペクト指向入門を読んでようやく理解出来るようになりました。callで定義すると「対象を呼ぶ側をweaving」し、executionで定義すると、「対象自体をweaving」するんですね。callならjavaの標準ライブラリに対してもweavingできるけどexecutionはできません。callは呼ぶ側から見た型でしか判断できないけど、executionは実際に呼ばれる型で判断できます。ただし、executionはweaving対象クラスに定義されているものしかweavingできない・・・なかなか難しいです。
コンパイルして実行する場合は、外部ライブラリに対するweavingはできませんが、load time weavingなら可能です。やっぱり色々な意味でload time weavingの方が汎用性が高い気がします。
あと、load time weavingを定義するaop.xmlでは、pointcutをabstractメソッドで定義しているabstractアスペクトを定義することが出来ます。実行する処理だけあらかじめ定義しておいて、aop.xmlの方で対象ポイントカットを定義できます。AspectJを使ってると、pointcutの定義箇所が色々ばらけてしまうのが気になっていたのですが、この方法なら一つのファイルで集中管理することができますね。

アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ

アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ