CDIのAOPはAOPプロキシ
当分の間、ビール1杯につき50円貯金することにしました。せこいですが、義援金にしようと。
さてCDIではまった点について。
CDIのAOPは「AOPプロキシ」という技術で実現されているようです。
「AOPプロキシ」とは
大雑把に言うと
- オリジナルを継承していて
- オリジナルのインスタンスを内包するクラス
を動的に作り出すことでAOPを実現します。
つまり実行時にはオリジナルのオブジェクトに加えてそれを包むオブジェクトが作られることになります。
CDIで管理されるオブジェクトは、アプリケーションプログラムが直接生成することはなく、コンテナが生成したオブジェクトを@Injectアノテーション指定にてインジェクトして使うことになります。
なので、実際のオブジェクトの型はあまり気にしなくていいということになります。
なのでAOPプロキシはたいていの場合でうまく動作するのですが、重要な制約があります。
AOPプロキシの制約
AOPプロキシでは動的に作られたサブクラスがInterceptorを介してオリジナルのメソッドを呼び出します。
つまりオリジナルのオブジェクト自体にはAOPがかかっていないわけです。
これは「オリジナルのオブジェクトから自身のメソッドを呼び出すときはAOPが適用されない」ということを意味します。
参考サイト
こちら↓のサイトを参考にさせていただきました。
http://d.hatena.ne.jp/ytake/20070519