I.はじめに
Javaの動的なプロキシによってAOP傍受機能を実現しています。端的に言えば、上のターゲットクラスに基づいてカットロジックを高める強化ターゲットクラスを生成する(セクションロジックまたはターゲット機能を実行する、またはターゲットクラスの関数実行後、または対象のクラス関数上で実行されたときに例外をスローする前にすることである。異なりますインターセプタに対応する切削時間の異なるタイプ、例えばBeforeAdviseInterceptor、AfterAdviseInterceptor ThrowsAdviseInterceptorなど)。その後、動的プロキシは、それにターゲットクラスのアプローチに織り込まロジック部(アドバイス)を達成する方法ですか?ここでは詳細に説明し、で使用される2つの動的プロキシAOPを実現します。ステージ機能傍受実装するために2つの動的プロキシに使用AOPソースコード:JDKダイナミックプロキシとCGLIB動的プロキシ。どちらの方法でも、利点と欠点が存在します。JDK動的プロキシ機構を実現するJavaの内部で反射され、CGLIB基礎となる動的プロキシは、ASMの手段によって実現されます。一般的に、より効率的な生成クラス、および相関処理の反映処理は、より効率的なASM生成されたクラスの後に行われる(ASMは、生成されたクラスでキャッシュすることができ、クラスは、ASM生成プロセスの非効率性を解決しました) 。また、注意しなければなりません:前提のJDKのダイナミックプロキシは、それがターゲットクラス統一されたインタフェースに基づいていなければなりません。そうでない場合は上記の前提は、JDKの動的プロキシを適用することはできません。動的プロキシは、いくつかの制限、より広く、よりダイナミックなプロキシを実装CGLIBサードパーティ製のライブラリ効率の利点を持っているをjdk、見ることができます。
第二に、ケース
チケットを購入するユーザーのフライングピッグは、例えば、プラットフォームがプロキシフライングピッグ、チケットに基づいてユーザのためのフライングピッグプラットフォームであることは明らかですが、また、このようなチェックIDカードのチケットなどの追加機能を追加します購入後、ユーザーに資格情報を提供する必要があります。
アクセスID番号、名前、バランスを含む1、定義されたインタフェースの購買行動、
パブリックインターフェースTicketBuy { / ** *チケット * / 無効買い(); / ** * ID番号を取得します。 * @return * / ストリングのgetId(); / ** *名前を取得します。 * @return * / 文字列のgetName()。 / ** *バランスを取得 * @return * / ダブルgetMoney(); }
図2に示すように、ユーザのクラス定義、すなわち、プロキシクラス
パブリック クラスパーソン実装TicketBuy { プライベート文字列ID; プライベート文字列名; プライベートダブルお金。 @オーバーライド パブリック文字列のgetId(){ 戻りID。 } 公共 ボイドSETID(文字列ID){ この .ID = ID。 } @オーバーライド パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } @オーバーライド 公共ダブルgetMoney(){ リターンのお金。 } 公共 のボイドsetMoney(ダブル金){ この .money = お金。 } @オーバーライド 公共 のボイド買い(){ この .money - 。 System.out.println(「ユーザー:」+ この .getName()+「はチケットを買うために、バランスは左:」+ マネー)。 } }
3、フライングピッグプラットフォームカテゴリの定義、すなわち、プロキシクラス
パブリック クラス FlyPig 実装のInvocationHandler { 民間人の対象; / ** *主なデータを取得します * @paramのターゲット * @return * / パブリックオブジェクトのgetInstance(人の対象){ この .TARGET = ターゲット。 クラスclazz = target.getClass()。 リターンたとえば、Proxy.newProxyInstance(clazz.getClassLoader()、clazz.getInterfaces()、この); } @オーバーライド パブリックオブジェクトを呼び出し(オブジェクトプロキシ、メソッドのメソッド、オブジェクト[]引数)がスローのThrowableを{ System.out.println( "フライングピッグプラットフォームチェックID +名:" + この .target.getId()+ "+" + この.target.getName()); この.target.buy(); System.out.println( "印刷バウチャー!" ); リターン ヌル。 } }
4、試験の種類:
パブリック クラスのテスト{ パブリック 静的 ボイドメイン(文字列[]引数){ 人PERSON1 = 新しい人(); person1.setName(「ジョー・スミス」)。 person1.setId( "35052511111111111" ); person1.setMoney( 100.00 )。 TicketBuyプロキシ =(TicketBuy)(新規。FlyPig()のgetInstance(PERSON1))。 proxy.buy(); } }
結果
5、決意