序文
Githubの:https://github.com/yihonglei/thinking-in-spring
CGLIBとJDKダイナミックプロキシ原理
1、JDKの動的プロキシ
(InvocationHanlderを実装する必要がありインターセプタ)インターセプタを使用して、プラスの反射は匿名クラスのインタフェースのプロキシを生成し、
特定のメソッドを呼び出す前に、コールを処理するためのInvokeHandler。
2、CGLIBダイナミックプロキシー
ASMは、オープンソースパッケージを使用して、クラスがサブクラスのバイトコードを変更することによって処理にロードされたプロキシオブジェクトクラスを、ファイル。
図3に示すように、JDKまたはCGLIBを使用するには?
1)ターゲット・オブジェクトが実装するインタフェース場合、デフォルトJDKダイナミックプロキシAOP実装ケースを使用します。
ターゲットオブジェクトがインタフェースを実装している場合2)、あなたはAOPを実現CGLIBの使用を強制することができます。
インタフェースを実装していない対象物がCGLIBライブラリを使用する必要がある場合3)、スプリングは自動的にJDKの動的プロキシとCGLIB切り替えます。
AOPを実現するCGLIBを強制的にどのように4、?
1)を添加したCGLIBライブラリ(aspectjrt-xxx.jar、aspectjweaver-xxx.jar、CGLIB-NODEP-xxx.jar)
2)Spring構成ファイルを追加<AOP:AspectJの-自動プロキシプロキシターゲットクラス= "TRUE" />
5、JDKの動的プロキシとバイトコード生成CGLIB差?
実装インターフェイスのみクラスのエージェントを作成し、できないこと1)JDKの動的プロキシクラス。
2)CGLIBクラスは、前記カバー、主に指定されたクラスのサブクラスを生成するための、方法実施剤に向けられています
そして、前記強化カバレッジのための方法が、継承、クラスやメソッドの使用は最終として宣言することが最善ではありませんので、
finalクラスやメソッドのために継承することはできません。
6、CGLIB速くJDKよりも?
1)使用CGLIBの動的プロキシ、ASM CGLIBボトムフレームバイトコード生成、プロキシクラスのバイトコード生成技術を使用して、
Javaリフレクション効率を使用してより高いJDK6の前に。唯一の注意点は、CGLIB最終の方法はのためのプロキシとして宣言することができないことです
CGLIB原理が動的に生成されるため、プロキシクラスはのサブクラスです。
2)JDK6後、JDK7、JDKの動的プロキシのjdk8緩やかな最適化、CGLIB JDKプロキシエージェント効率よりも効率的コール、より少ない数の場合には、
ときにのみCGLIBエージェントより少しより低いが、jdk8時間の通話時間、JDK6とJDK7 CGLIBエージェントの効率の多くは、JDK代理店より効率的に、
要するに、すべてのバージョンアップJDK、JDKエージェントの効率が改善されている、との報道機関CGLIBは本当に少しペースを維持します。
7、春またはどのようにJDK CGLIBを選択するには?
インタフェースビーンを実装する場合1)、スプリングは、JDKの動的プロキシを使用します。
Beanのインタフェースを実装していない場合は2)、スプリングを使用CGLIBが達成されます。
3)CGLIBを強制することができ(春に追加構成<AOP:AspectJの-自動プロキシプロキシターゲットクラス= "TRUE" />)。
継続的に更新さ......