CDIのAOPはAOPプロキシ

当分の間、ビール1杯につき50円貯金することにしました。せこいですが、義援金にしようと。

さてCDIではまった点について。
CDIAOPは「AOPプロキシ」という技術で実現されているようです。

AOPプロキシ」とは

大雑把に言うと

  • オリジナルを継承していて
  • オリジナルのインスタンスを内包するクラス

を動的に作り出すことでAOPを実現します。

つまり実行時にはオリジナルのオブジェクトに加えてそれを包むオブジェクトが作られることになります。

CDIで管理されるオブジェクトは、アプリケーションプログラムが直接生成することはなく、コンテナが生成したオブジェクトを@Injectアノテーション指定にてインジェクトして使うことになります。
なので、実際のオブジェクトの型はあまり気にしなくていいということになります。

なのでAOPプロキシはたいていの場合でうまく動作するのですが、重要な制約があります。

AOPプロキシの制約

AOPプロキシでは動的に作られたサブクラスがInterceptorを介してオリジナルのメソッドを呼び出します。
つまりオリジナルのオブジェクト自体にはAOPがかかっていないわけです。

これは「オリジナルのオブジェクトから自身のメソッドを呼び出すときはAOPが適用されない」ということを意味します。

その他の挙動

また、サブクラスのオブジェクトが呼び出されるときにオリジナルのコンストラクタが呼び出されるため、オリジナルのコンストラクタは複数回呼び出されることになります。

Seasarの場合

SeasarバイトコードエンハンスメントでAOPをかけているようです。
なにしろクラスを改変しているので、CDIAOPのような制約は存在しません。すごいです。

参考サイト

こちら↓のサイトを参考にさせていただきました。
http://d.hatena.ne.jp/ytake/20070519