Javaの動的プロキシ - 達成するための基本原則Mybatiesインターセプタチェーン

1.概要

  :Mybatiesそこの前に意図的原則を理解するために、改ページのプラグインがありhttps://www.cnblogs.com/jonrain0625/p/11168247.html、その理解からページネーションプラグインがMybatiesを達成するためにインターセプタをベースにこのプラグインはインターセプタであり、他のインターセプタインターセプタチェーンMybaties、その後全てのインターセプタは、この動的プロキシクラスキュータで作られています。再度、基本的なインターセプタチェーンの効果を達成するために、このダイナミックなエージェントを研究するための鍵。もちろん、春AOPがあると他の多くの場所ができAopとに、達成するための動的プロキシに基づいています:https://www.cnblogs.com/lcngu/p/5339555.htmlを  理解すること。これは、この記事に基づいており、そして学び、コードインターセプタチェーンを実装します。

2.java動的プロキシ

  Javaプロキシモードと動的サブ静的剤剤、二つの方法で実現動的プロキシを達成するために、一方を達成するために、JDKとのインタフェースに基づいてクラスベースCGLIBを見ることができる理解に基づいて、達成することである:HTTPS:/ /www.cnblogs.com/rinack/p/7742682.html  。

  プロキシの2.1 JDK基本的な使用:

    1.プロキシクラスのインタフェースを作成します。

    インタフェースの実行を実装2.のInvocationHandlerプロキシクラス

    3.プロキシオブジェクトを生成する:たとえば、Proxy.newProxyInstance(ローダ、インターフェイス、H)。

    4.プロキシオブジェクトを使用します

    

 

 

3列を示します  

  カラムは、ログメソッドを実行する前にログ・インターセプト・ユーザー・クラスを達成するための方法を示し、ビジネスロジックを行うためのインターセプタチェーンLogIntercept1 LogIntercept2ログインターセプト法、ウェル反射インターセプタチェーンの利点は、結合を達成することである、高さを行うことができます内部変更します。

  3.1新しいプロキシクラスのインタフェースおよびプロキシクラス

  

パブリック インターフェースログ{
     公共 ボイドログ()。
}

 

パブリック クラスユーザーが   実装ログ{ 
    文字列名 =「USER1」を公共 ボイドログ(){ 
        System.out.printlnは( "USER1 -----登陆" ); 
    } 
}

  3.2新しいのInvocationHandlerの実装クラス

    パッケージングのために、たとえば、Proxy.newProxyInstanceビンと呼ばれる方法は、プロキシオブジェクトは、プロキシオブジェクトとインターセプターに注入プロキシオブジェクト、invokeメソッドによってインターセプタプロキシ実行を作成します。

  

パブリック クラスハンドラは、実装のInvocationHandler {
     // 调用对象
    プライベートオブジェクトのプロキシを。
    // 目标对象
    プライベートインターセプトインターセプト。
    
    
    プライベートハンドラ(インターセプト対象、オブジェクトプロキシ){
         この .intercept = ターゲット。
        この .proxy = プロキシ。
    } 
    パブリック 静的オブジェクトバインド(インターセプト対象、オブジェクトプロキシ){
         戻りたとえば、Proxy.newProxyInstance(
                proxy.getClass()のgetClassLoader()
                、proxy.getClass()でgetInterfaces()は、新しいですハンドラ(ターゲット、プロキシ))。
    }
    @Override 
    パブリックオブジェクトを呼び出し(オブジェクトプロキシ、方法方法、[]引数オブジェクト)
             スローのThrowable {
         戻り intercept.intercept(この.proxy、方法、引数)を、
    } 
}

  3.3インターセプタを作成します 

    文書で怠惰な書き込み、インターセプタ、インターセプタを実装

  

インポートにjava.lang.reflect.InvocationTargetException;
輸入java.lang.reflect.Methodオブジェクト。

パブリック インターフェースインターセプト{ 
    オブジェクトインターセプト(オブジェクトo、メソッドm、[] OSオブジェクト)。
} 
クラス LogIntercept1は実装インターセプト{ 

    @Override 
    公共{([] OSオブジェクト、オブジェクトO、メソッドm)オブジェクトインターセプトを
         試みる{ 
            するSystem.out.println( "LogIntercept1拦截登陆操作做相关业务逻辑" )。
            戻りm.invoke(O、OS)を、
        } キャッチ(IllegalAccessExceptionが|はIllegalArgumentException | にInvocationTargetException電子){
            e.printStackTrace();
            リターン ヌル
        } 
    } 
    
} 
クラス LogIntercept2が実装インターセプト{ 

    @Override 
    公共{オブジェクトインターセプト(オブジェクトo、メソッドm、[] OSオブジェクト)を
         試す{ 
            (のSystem.out.printlnを "LogIntercept2拦截登陆操作、做相关业务逻辑" )。
            戻りm.invoke(O、OS)を、
        } キャッチ(IllegalAccessExceptionが|はIllegalArgumentException | にInvocationTargetException電子){ 
            e.printStackTrace(); 
            リターン ヌル
        } 
    }
}

 

 3.4プロキシファクトリの作成 

    インターセプタの数に基づいて、クラスでは、プロキシクラスのサイクルを実行します。すべてのプロキシみなさインターセプター着信プロキシオブジェクト。

  

パッケージ设计模式.com.pox.logPoxy。

輸入はjava.util.ArrayList;
輸入はjava.util.List; 

パブリック クラスProxyFactory { 
    
    リスト <インターセプト> InterceptChain = 新規のArrayList <インターセプト> (){
         プライベート 静的 最終 長いのserialVersionUID = 1L 

        { 
            追加(新しいLogIntercept1())。
            追加(新しいLogIntercept2()); 
        } 
    }。
    
    
    パブリック   オブジェクトのプロキシ(クラス<?> classz)がスロー例外を{
         しようと{
            OBJオブジェクト = classz.newInstanceは();
             を返す; InterceptAll(OBJ)を
        } キャッチ |(ないInstantiationExceptionはありません{IllegalAccessExceptionがE)
             スロー 新しい新 ;のRuntimeException( "例外エージェント")//は、例外をスローし、設計の追加の異常タイプ、のRuntimeExceptionで場所
        } 
    } 
    
    / ** インターセプタエージェント
     * @param OBJ 
     * @return 
     * / 
    プライベートオブジェクトInterceptAll(オブジェクトobj){
         IF (InterceptChain.isEmpty()){
             戻りOBJ; 
        } 
        ため(インターセプトインターセプト:InterceptChain){ 
            OBJ = Handler.bind(インターセプト、OBJ); 
        } 
        戻りobjが; 
    } 
    
    // これは、単一のモードを作成することです
    公共ProxyFactory(){
         IF(!inner.proxyFactory = ヌル){
             スロー 新しい新しいのRuntimeExceptionを( "複数のインスタンスを許可しない作成" ); 
        } 
    } 
    パブリック 静的ProxyFactory getProxyFactoryは(){
         戻り  inner.proxyFactoryを; 
    } 
    プライベート 静的 クラスインナー{
         静的 ProxyFactory ProxyFactory =新しいProxyFactory(); 
    } 
}

 

 

  3.5テスト

パブリック クラスのテスト{
     公共 静的 ボイドメイン(文字列[]引数)をスロー例外{ 
        ProxyFactory ProxyFactory = ProxyFactory.getProxyFactoryを(); 
        ログユーザー =(ログ)proxyFactory.proxy(ユーザー。クラス); 
        USER.LOG(); 
    } 
} 
/ ** 
ouputを:
LogIntercept2傍受上陸作戦の
上陸作戦インターセプトLogIntercept1 
USER1 -----着地
* /

 

 

上記を達成するためにインターセプタの簡単な鎖である、あなたがインターセプタチェーンMybatiesにアクセスするために行くことができるビジネスは、インタフェースインターセプトを実装し、インターセプタチェーンを増やす必要がある場合、原理は同じであるが、ProxyFactoryインターセプタチェーンにおけるエージェントの工場に追加InterceptChainすることができますデカップリング機能の高度を達成。

 

おすすめ

転載: www.cnblogs.com/jonrain0625/p/11431511.html