JDK Dynamic Proxy, CGLIB


入る前に。


Proxy


ターゲット機能を実行するときに機能を拡張または追加する実際のオブジェクトを指します.

Spring AOP


SpringはProxyに基づいてAOP機能を提供します.
JDK Dynamic ProxyおよびCGIBはAOPを提供する.
  • のコードを避ける:コード
  • 、開発者が直接汎用機能(ログ)を入力する
  • 向けのコード:汎用機能(ログ)を観点(aspect)に分離し、各方法のコード
  • に観点を適用する.
  • は、コードの内部動作
  • を指す.

    JDK Dynamic Proxy

    Object proxy = Proxy.newProxyInstance(
       ClassLoader, 
       Class<?>[],
       InvocationHandler
    );
  • インタフェースに基づくエージェント
  • targetクラスの欠点は、インタフェース
  • を実装する必要があることである.
  • 特定のオブジェクトに対する反射の使用によりパフォーマンスが低下

    Reflection


    具体的なclass typeはわかりませんが、そのclassのmethod、type、変数の機能にアクセスできます.
    classを動的にロードし、heapでオブジェクトを作成するプロセスはパフォーマンスのホットスポットのようです?!

    CGLIB (Code Generator Library)

    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(Target.class); 
    enhancer.setCallback(MethodInterceptor);
    
    Object proxy = enchancer.create(); // proxy 생성
  • classを継承し、バイトコードによってプロキシオブジェクト
  • を作成する

    Conclusion


    以前。


    Springは、Enhander 의존성 추가default 생성자 필요およびtarget의 생성자 2번 호출の欠点のため、CGIBの使用を推奨しない.

    今。


    Spring 3.2リリースから、Spring Coreパッケージはcglib가 포함に達しました.
    4リリースでは、Objectensisのヘルプでdefault 생성자 없이 proxy 생성を使用できます.생성자가 2번 호출되는 단점도 개선だそうです

    結果


    cglibの制約が改善され、Springでよりパフォーマンスの良いCGIB Proxyが作成されました.

    References

  • https://gmoon92.github.io/spring/aop/2019/04/20/jdk-dynamic-proxy-and-cglib.html
  • https://dreamchaser3.tistory.com/9
  • Reflection

  • https://lob-dev.tistory.com/entry/Java%EC%9D%98-Reflection-API