AOPの用語

まさたかさん[seasar-tutorial]-S13で見かけたAOPの用語が自分の曖昧な理解と微妙に異なっているような気がしたので,AspectJの解説書などで確認してみました.忘れないように書いておきます.というか,間違っていたら指摘してください.

  • Joinpoint

プログラム中で識別可能な場所(の種類)で,Aspectを組み込むことができる場所を示します.AspectJで利用できる主なJoinpointとしては,メソッドの呼び出と実行,コンストラクタの呼び出と実行,クラスやオブジェクトの初期化時,フィールドの参照および更新,例外のキャッチなどがあります.
ランタイム型の(ダイナミックな)AOP環境では,フィールドの参照および更新はサポートされていないことがあるようです.

  • Pointcut

特定の(具体的な)Joinpointのことで,Advice(後述)等を組み込む場所を示します.分かりにくい書き方ですが,Joinpointは組み込むことが「できる」場所,Pointcutは実際に組み込む場所です.
JoinpointとPointcutの関係は,型とインスタンスに例えることができると思います.JoinpointをintやStringに例えるなら,Pointcutは12"Foo""Bar"といった感じです.実際には,Joinpointがメソッド呼び出しなら,PointcutはFooというクラスのhoge()というメソッドの呼び出し,という具合です.
正確には,Pointcutはワイルドカードを使うなどして,複数のJoinpointを選択できるので,Joinpointという集合(型)の要素(インスタンス)ではなく,部分集合というべきでしょうか.

  • Advice

Pointcutで選択されたJoinpointで実行されるコードです.
Joinpointの前に実行されるBefore Advice,後に実行されるAfter Advice,前後を包み込むように実行されるAround Adviceがあります.
Around Adviceは,Joinpointの動作を置き換えたり,スキップすることもできます.Around Adviceがあれば,Before AdviceやAfter Adviceはなくてもさほど困らないはずですが,AspectJやSpringではそれぞれを用意しています.

  • Introduction

classinterfaceに対して,親のclass/interfaceを追加したり,フィールドやメソッドを追加することです.

  • Compile-time declaration

コンパイル時に警告やエラーを出すための規則です.例えば,System.exit(int)を呼び出すというPointcutに対して警告を出すことなどができます.
当然ながら,ランタイム型のAOPではサポートされていないと思います.なんせCompile-timeに使われるものですから.

Pointcut,Advice,Introduction,Compile-time declarationを集めたもので,AspectJのモジュールとなるものです.
Pointcutをフィールド,Adviceをメソッド,そしてAspectをクラスに例えるとわかりやすいと思います.Javaのモジュール単位はclassinterfaceであり,フィールドやメソッドはそれ単独ではモジュールではありません.同様に,AspectJではAspectがモジュール単位であり,PointcutやAdviceはそれ単独ではモジュールではないと思います.
ランタイム型のAOP環境では,PointcutやAdviceがJavaclassとして作成される,つまり独立したモジュールとなっている場合が多いようで,AspectJとは事情が異なっているようですが,PointcutとAdviceの組み合わせをAspectと呼んでいるという点では一致していると思います.

  • Weaving

クラスやメソッドに対して,Aspectを織り込む処理のことです.
クラスやメソッド(core concern)を縦糸,Aspect(crosscutting concern)を横糸と見立てて,生地を織る(weave)というわけです.

  • Weaver

Weavingを行うものです.AspectJでは,その処理系そのものがWeaverです.AOPに対応したIoCコンテナの場合は,そのコンテナがWeaverであることが多いと思われますが,Springの場合はコンテナではなく,BeanとしてWeaverが実装されています.


まさたかさんの日記で気になったところは,AspectがWeavingされた後のものを指しているように見えるところです.そうでない解釈もできそうで微妙なのですが.自分の理解では,AspectはWeavingされるものであって,されたものではありません.細かくてすみません.
また,[seasar-tutorial]-S12ではAround Advice中のproceedの前後をそれぞれBefore Advice,After Adviceと呼ぶことがあるとも書かれているのですが,AspectJやSpringでは,Around Advice中のproceed前後とBefore Advice,After Adviceは別のものだと思います.
本当,細かくてすみません.揚げ足を取りたいわけではないのでご容赦を.