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することができますデカップリング機能の高度を達成。