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つのオブジェクトが生成されることになるため。




参考