JavaSEプロキシとCGLIBプロキシ
Springでは、実行時にターゲットオブジェクトのAOPプロキシを動的に生成することで、AOPを実現しています。
※AOPプロキシ:AOPフレームワークにより生成されたadviceをもつオブジェクト
AOPプロキシを生成する方法としては、2つの方法があります。
1つでもインターフェースが実装されていればJavaSEのダイナミックプロキシがデフォルトで適用され、インターフェースがなければCGLIBプロキシが適用されます。
ただし以下のように指定すれば、デフォルトでCGLIBを利用するようになります。
<aop:config proxy-target-class="true"> </aop:config>
AspectJのオートプロキシサポート(2.0から)で、CGLIBプロキシを使う場合。
<aop:aspectj-autoproxy proxy-target-class="true"/>
CGLIBプロキシを使う場合には、以下の点に留意する必要があります。
- finalメソッドはオーバライドできないので、プロキシを生成できない。
- クラスパスにCGLIB2が必要(ダイナミックプロキシはJDKがあればよい)。CGLIB2がない場合は以下のようなINFOログが出力される。
2007-05-19 21:43:37,156 INFO [main][org.springframework.aop.framework.DefaultAopProxyFactory] - CGLIB2 not available: proxyTargetClass feature disabled
- ターゲットオブジェクトのコンストラクタは2度呼び出される。なぜなら、CGLIBプロキシはターゲットオブジェクトのサブクラスとして生成されるので、結果として2つのオブジェクトが生成されることになるため。
参考