AspectJのジョインポイントは「場所」ではなく「とき」

アスペクト指向入門にはこのことが繰り返し書かれています。The Aspect Programming Guideを調べてみると確かに次のように記されています。"program"ではなく"program flow"というのがポイント。

A join point is a well-defined point in the program flow. A pointcut picks out certain join points and values at those points. A piece of advice is code that is executed when a join point is reached. These are the dynamic parts of AspectJ.

たとえば、メソッドに関するジョインポイントは、メソッドという「場所」ではなく、メソッド呼び出しという「とき」ということです。メソッドはオブジェクトの一部ですが、メソッド呼び出しは実行スレッド中のある一点になります。

スレッドですから、実行オブジェクトや変数、スタックなどの情報(=コンテキスト)をもっています。つまり、「とき」と言い表すことで、ジョインポイントにこのようなコンテキストが関連づけられ、ポイントカットでコンテキストに応じたフィルタが可能になることが理解できます。

Implement Your Own Proxy-Based AOP Framework

非常にコンパクトなMy AOPフレームワーク。ProxyとAnnotationを使えば簡単にできそう。おまけにCGLIBの実装例まであります。一般的なAOPフレームワークを使う必要もない。OSSライブラリの依存性が嫌。ならば自分で作ってしまえ、という選択。