使用することは非常にシンプルですが、JDKのダイナミックプロキシは、1つまたは複数のインターフェイスを実装する必要がありますが、インターフェイスを実装したくない場合、あなたはCGLIBエージェントを使用することができますので、それはまた、いくつかの制限がありJDKのダイナミックプロキシ。
CGLIB(コード生成ライブラリ)、フレームASM(のJavaバイトコード操作フレーム)変換ワードを処理する小型で高速バイトコードを使用して底層である多くのAOPフレームワークによって使用される高性能パッケージオープンソースコードジェネレータでありますコードのセクションとは、新しいクラスを生成します。したがってCGLIBは、ASMに依存して、コアパッケージを抽出スプリングスプリングは、ファイルディレクトリ図-3.2.2.RELEASE.jarを-core。
コアパッケージを解凍すると、コアパッケージのSpring3.2.13バージョンはパッケージCGLIBの必要性を統合してきたと言うことですCGLIBとASMを、含まれている、開発中の追加のASMのJARパッケージをインポートする必要はありません。次のシナリオでは、プロキシプロセスCGLIBによって達成示しています。
1 。GoodsDaoは、ターゲットクラスの作成 対象のクラスGoodsDaoのcom.mengma.daoパッケージ内に作成、追加、削除、変更、メソッドで定義されたクラスを、それぞれの方法で出力文を書き、次の通り。 パッケージcom.mengma.dao; パブリック クラスGoodsDao { 公共 空の追加(){ System.out.printlnは( "追加製品..." ); } パブリック 無効の更新(){ System.out.printlnは(「変性物.. 。 " ); } 公共 ボイド削除(){ System.out.printlnは( "削除アイテム... " ); } 公共 ボイド検索(){ System.out.printlnは( "変性物...」)。 } } 2 。MyBeanFactoryは、プロキシクラスを作成し、 以下のように、このパッケージクラスMyBeanFactoryを作成するcom.mengma.cglibという名前のsrcディレクトリにパッケージを作成します。 パッケージcom.mengma.cglib; インポートjava.lang.reflect.Methodオブジェクト、 インポートorg.springframework.cglib.proxy.Enhancer; インポートorg.springframework.cglib.proxy.MethodInterceptor; インポートorg.springframework.cglib.proxy.MethodProxy; インポートcom.mengma.dao.GoodsDao; インポートcom.mengma.jdk.MyAspect、 パブリック クラスMyBeanFactory { パブリック 静的goodsDao getBeanは(){ // 特定のクラス準備 最終 goodsDao goodsDaoは= 新しい新規の GoodsDao(); // クラスインスタンスカット作成 最終 MyAspect myAspect = 新しい新しいMyAspect(); // 生成されたプロキシクラスを、CGLIB、動作、強化指定されたオブジェクトのサブクラス、 エンハンサーエンハンサー= 新しい新規エンハンサー(); // 決定クラス強化する必要 enhancer.setSuperclass(goodsDao.getClassを()); // コールバック追加 enhancer.setCallbackを(新しい新しいMethodInterceptorの(){ // インターセプト対応JDKを呼び出し、最初の3つのパラメータJDK invoke-アクチュエータ @Override パブリックオブジェクトインターセプト(オブジェクトプロキシ、メソッドのメソッド、オブジェクト[]引数、 MethodProxy MethodProxy)がスローのThrowableは{ ; myAspect.myBefore()// 前部補強 対象物OBJ = Method.invoke(goodsDao、引数); // ターゲットメソッドが実行 myAspect.myAfterを(); //のように拡張 戻りOBJ; } }); // プロキシクラス作成 GoodsDao goodsDaoProxy = (GoodsDao)enhancer.createは(); 戻りgoodsDaoProxy; } } 上記のコードは、コアクラスエンハンサーCGLIBの応用。最初に 19 クラスsetSuperclassエンハンサー()メソッドを呼び出すコード行、対象オブジェクトが決定されます。 最初のライン21のコードは、のsetCallback()メソッドは、コールバック関数を追加呼び出す。インターセプト最初のコードの24行()メソッドは、動的プロキシモードJDKの呼び出し()メソッドに相当し、この方法は、方法の態様のクラス、ターゲットメソッドの前後に行われます増強;クラスエンハンサー()メソッドを呼び出し、そして最終的にはプロキシクラスに戻りコードの33〜34行を作成するために、プロキシクラスを作成します。
3 。テストクラスを作成し 、以下に示すように編集され、com.mengma.cglibでテストパケットクラスCGLIBProxyTestを作成します。 パッケージcom.mengma.cglib; インポートorg.junit.Test; インポートcom.mengma.dao.GoodsDao、 パブリック クラスCGLIBProxyTest { @Test 公共 ボイド試験(){ // 得られたスプリングに対応する(植物から指定されたコンテンツを得るが、このオブジェクトは、コンテンツ・エージェント)である goodsDao goodsDao = MyBeanFactory.getBean(); //は、メソッド実行 goodsDao.addを(); goodsDao.update(); goodsDao.delete(); goodsDao.find(); } } getBean()メソッドを呼び出すときに、上記のコード、依然としてgoodsDaoプロキシオブジェクトが得られ、その後、オブジェクトのメソッドを呼び出します。図コンソール出力に示すように、テスト()メソッドの後に使用JUnitテストは、成功しました