呉ユーキション - 自然JAVA SPRINGの研究ノートの開発のための自然なフレームワーク:春CGLlB動的プロキシ

使用することは非常にシンプルですが、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テストは、成功しました

 

おすすめ

転載: www.cnblogs.com/tszr/p/12129921.html