序文
春SpringBootに配置され得るか、または織りの機能を達成するために、切削点@Aspect注釈発現等により切断。しかし、最終的にはその内部には、それを達成する方法ですか?
確かに、春の起動クラスは、呼び出し元のメソッドの前または後に真達成するために、代わりに実際のクラスのプロキシクラスの操作による操作で、プロキシクラスのカットポイント法のために生成され、私たちのカスタム・ロジックの一部に挿入されています。
プロキシクラスを生成するにはどうすれば?
JDKダイナミックプロキシ
- JDKは持っている必要があります動的プロキシプロキシクラスを必要とするインターフェイス抽象化。
- 実装によって のInvocationHandler インタフェースを、実装 ([]引数は、プロキシオブジェクトオブジェクト 、メソッドのメソッド)を呼び出す カスタムロジックを製織する方法を:
- プロキシ:現在のプロキシクラスのインスタンス。
- 方法:エージェントの方法。
- 引数:参照方法。
以下に説明する公式invokeメソッド:すなわち
*プロキシインスタンスでメソッド呼び出しを処理し、戻り
結果を*。このメソッドは、呼び出しハンドラで呼び出される
メソッドは、それがされていることをプロキシインスタンスで呼び出されたとき*
*に関連付けられています。
使用例:
パブリック クラス MyInvocationHandler 器具のInvocationHandler {の プライベートオブジェクトターゲット; を注入プロキシオブジェクトによって//コンストラクタ パブリックMyInvocationHandler(オブジェクト・ターゲット){ この .TARGET = 目標; } // コールバック @Override パブリックオブジェクトを呼び出し(オブジェクトプロキシ、メソッド、メソッド、オブジェクト[] argsが)投げたThrowable { System.out.printlnはは( "私はエージェントだ、誰かが私があなたに言わせて:" ); / ** 呼び出す前に、カスタムビジネス* / オブジェクトRES = Method.invoke(ターゲット、引数) ; / ** 呼び出した後に、カスタムビジネス* / リターンのres; } // 获取代理类实例 公共 <T> T getProxyInstance(){ リターン(T)たとえば、Proxy.newProxyInstance(target.getClass()のgetClassLoader()。 target.getClass()でgetInterfaces()。本); } }
電話して出力:
パブリック 静的 ボイドメイン(文字列[]引数){ HelloAOPImpl helloAOP = 新しい新しいHelloAOPImpl(); MyInvocationHandler myInvocationHandler = 新しい新しいMyInvocationHandler(helloAOP); HelloAOPプロキシ = myInvocationHandler.getProxyInstance(); proxy.sayHello(); } // 出力 Iエージェント誰かが私があなたに言わせて: こんにちは、AOP
質問:どのようにプロキシクラスを置き換えるためには、プロキシクラスそれで?