spring Aopの下の階はダイナミックエージェントですか?それともcglibですか?

1846 ワード

一、概要
まず、Spring AOPの下の実装には、2つの方法があります。一つはJDKダイナミックエージェント、もう一つはCGlibの方式です。
JDK動的代理は主にjava.lang.reflectの下の二つの種類に関連しています。ProxyとInvocationHandler。この中で、InvocationHandlerはインターフェースであり、このインターフェースを実現することによって、横断的な論理を定義し、反射メカニズムによってターゲットクラスのコードを呼び出し、横断的な論理と業務ロジックを動的に切り下げることができる。
JDKダイナミックエージェントは、インターフェースのためのプロキシのインスタンスを作成することができますが、インターフェースを介してトラフィック方法を定義していないクラスについては、CGibを使用して動的エージェントを作成します。CGlibは、クラスのためにサブクラスを作成することができます。サブクラスでは、メソッドブロックの技術を使用して、すべての親メソッドの呼び出しを遮断し、クロスカットロジックに順次織り込むことができます。
二、JDKとCGibの動的代理区別1、JDKダイナミックエージェントの具体的な実現原理:
InvocationHandletインターフェースを実現することにより、自分の呼び出しプロセッサを作成する。
ProxyクラスのためにClass Loaderオブジェクトとinterfaceのセットを指定して動的エージェントを作成します。
反射機構により動的エージェントの構造関数を取得し、その固有のパラメータタイプはプロセッサインターフェースタイプを起動することである。
構造関数によって動的エージェントのインスタンスを作成し、構成時にプロセッサオブジェクトをパラメータとして参照するように呼び出します。
JDK動的エージェントは、インターフェースに向けたプロキシモードであり、プロキシターゲットがインターフェースを持っていない場合はSpringも無力であり、Springは、Javaの反射機構によってプロキシインターフェースによって新たな匿名のインプリメンテーションクラスを生成し、AOPの強化方法を書き換えた。
2、CGlibダイナミックエージェント:
CGlibは強力で高性能なCode生産クラスで、運行期間のダイナミックな拡張java類を実現できます。Springは運行期間中にCGlibを通じて動的に代理されるクラスを継承して、父親類を書き換える方法で、AOPの切断面向けプログラミングを実現します。
3、両者の比較:
例:
OrderService orderService = (OrderService) DubboContext.getInstance().getBeanFactory().getBean("orderService");
これはダイナミックエージェントで実現されます。
OrderServiceImpl orderServiceImpl = (OrderServiceImpl ) DubboContext.getInstance().getBeanFactory().getBean("orderService");
これはcglibで実現されました。
JDK動的エージェントはインターフェースに向かっている。
CGlib動的エージェントは、バイトコードの下でエージェントクラスを継承することによって実現される(finalキーワードによってプロキシが修飾されると、失敗する)。
4、使用上の注意:
代理される対象が実装クラスの場合、SpringはJDKダイナミックエージェントを使用して動作を完了します。
代理される対象が実装されていない場合、SpringはCGlibを強制的に使用して動的エージェントを実現します。
三、JDKとCGibの動的代理性能の対比
以前のJDKバージョンでは、JDKダイナミックエージェントの性能はそれほど高くないです。jdk 1.6以降はcglibより高くなります。