どのようにAOPを理解しますか
4373 ワード
面接の時、spring AOPについて話してくださいませんか?
springのAOPは動的な代理に基づいて代理の対象を生成します.
ターゲットのメソッドを呼び出し、その前後にトラフィックロジックを追加します.そして、もうなくなりました.
このように、核心の概念は私に二言三言でカバーされました.
だから、今日は思い切って、AOPをよく研究して、全面的に、はっきりと説明できるように頑張ります.
1.キーワード:
AOPをはっきり説明して、面に向かってプログラミングします.
では、カット、プロキシ、ターゲット、ニット、ブロックの5つの概念を明確にする必要があります!
AOPといえば、まず思いつくのがログ管理です.私たちはある方法で呼び出した時、ある情報をログに書き込みたいです.
目的を達成するためには、各方法に直接に同じロジックを追加することができます.
しかし、このように明らかに適当ではないです.共通性が多すぎて、同じ論理が繰り返し書いています.説明は抽象的にもできます.
第二に、もしあなたが次にログに書き込む内容を修正するなら、各方法を改めて修正しなければなりません.
結合度が高すぎる
共通性があると言ったばかりなのに、なぜこれらのコードを抽象化しないのですか?この類は見られます.
うどん一つ!実は、うどんについては、一つの方法が実行されると、いつも一歩ずつです.
たとえば、下のtestCompute()は、実際にはcompute()として機能しています.
ログ処理もこの方法の一部です.
元々はログを追加するクラスがターゲットです.
私たちはカット面とターゲットオブジェクトを一緒に編むと、プロキシオブジェクトが得られます.
一つの要求が伝わってくると、プロキシオブジェクトはブロックされ、それによって対応する要求を処理します.
設定情報は、元の方法の前後に論理を追加し、ターゲットオブジェクトを呼び出す方法です.
2.どのようにしてその種類に、その方法はいつ追加のロジックを追加しますか?
定義で:
Pointcut:これらの方法はうどんを注入する行為が必要です.それは方法の集合です.
ジョインポイント:接続点の一つであるpointは複数のジョインポイントに対応しています.
アドバンス : あなたが追加するロジックは、位置を指定することができます.
アドバイザー :その方法でそのadviceを定義します.
3.どのように編まれていますか?つまり代理人を得るにはどうすればいいですか?
JDK動的エージェント機構JDKダイナミックエージェント実現原理 この文章は分析がはっきりしている.
Proxyの静的方法newProxyInstanceから始まります.三つのパラメータ:class[]interfaces、InvocationHandler handler Class Loader loader
三者の役割:
インターフェース あなたが代理したいインターフェースです.複数のインターフェースを代理できますが、インターフェースでなければなりません.具体的に実現できない種類です.
ハンドル: その中のinvokeの方法を通して、あなたは異なっている方法のために、adviceを添加することができます!反射でターゲットクラスの呼び出し方法
loader: クラスの読み込み環境
彼が生成した代理人を通じて、新しいクラスです.同じクラスの文書があります.彼の方法は代理のインターフェースの方法と同じです.これらのインターフェースを実現しなければならないからです.
ただ実現した場合は、handlerのinvoke()を呼び出す方法であり、これもなぜ以下のinvoke()がコールバック方式であり、ターゲットクラスの
ある方法の時は、invokeメソッドを呼び出します.
実際にこのように見ると、エージェントクラスとターゲットクラスは、同じインターフェースを実現しており、エージェントクラスはターゲットクラスに基づいて、対応する方法の実装に追加の操作を追加します.
しかし、エージェントの生成は事前に作成したコードではなく、実行時に動的に生成されることを確認してください.新しいクラスです.目標クラスとの継承は存在しません.
実現する関係
cglib:
バイトコードで操作!代理インターフェースだけに限定されません.
CGLOIBは、ターゲットクラスのサブクラスを生成し、親類非final修饰子の方法(機能強化)を書き換えることができる.
4.どうやってブロックしますか?
あるpointCutで指定された方法を呼び出すと、実質的にはエージェントのようなこの方法が呼び出されますが、エージェントの実装は、handlerのinvoke方法を呼び出すことによって行われます.
Jdkを通じて提供されるプロキシモードのように、InvocationHandlerインターフェースを実現しなければなりません.
のコールバック方法は、タンジェントが実行されるかどうかに関係します.
SpringのAOPの中で、私達は自分でInvocationHandlerを実現する必要がなくて、私達のしたいのはうどんを定義します.
配置ファイルでspringを教えてください.これらの方法のこれらのところにadviceを追加したいです.
そして、springはこれらのadviceをブロックチェーンに追加します.フィルタのようです.
チューニング方法invoke()を呼び出すと、このブロックチェーンを使います.そして、このブロックチェーンを巡回します.これを見てください.
方法の中で第一にあなたのこのスクリーンセーバー(advisor)かどうか、それから再帰的に呼び出される過程です.
JdkDynamic Proxy invoke():
//要求の方法をブロックに加える.
5.代理先はいつ生成されましたか?ライフサイクル
初期化すると生成されます.
スプリング容器を起動する時に何が発生しましたか?
实例化bean 解析aop:configの構成は、切り込み点式に解析されると、切り込み点式のクラスとSpring容器のクラスをマッチングさせ、プロキシオブジェクトの生成に成功した(通知+ターゲット方法)と一致する.
代理オブジェクトを生成する時、Springはターゲットクラスがインターフェースを実現しているかどうかを検査します.もしあるなら、JDK Proxyを採用して代理オブジェクトを生成します.いいえ、CGlibを採用して代理対象を生成します. テストクラスでctx.getBenを呼び出した時に発生したことは何ですか?取りたいbeanがプロキシオブジェクトを持っていて、ない場合は対象自体に戻ります.
springのAOPは動的な代理に基づいて代理の対象を生成します.
ターゲットのメソッドを呼び出し、その前後にトラフィックロジックを追加します.そして、もうなくなりました.
このように、核心の概念は私に二言三言でカバーされました.
だから、今日は思い切って、AOPをよく研究して、全面的に、はっきりと説明できるように頑張ります.
1.キーワード:
AOPをはっきり説明して、面に向かってプログラミングします.
では、カット、プロキシ、ターゲット、ニット、ブロックの5つの概念を明確にする必要があります!
AOPといえば、まず思いつくのがログ管理です.私たちはある方法で呼び出した時、ある情報をログに書き込みたいです.
目的を達成するためには、各方法に直接に同じロジックを追加することができます.
しかし、このように明らかに適当ではないです.共通性が多すぎて、同じ論理が繰り返し書いています.説明は抽象的にもできます.
第二に、もしあなたが次にログに書き込む内容を修正するなら、各方法を改めて修正しなければなりません.
結合度が高すぎる
共通性があると言ったばかりなのに、なぜこれらのコードを抽象化しないのですか?この類は見られます.
うどん一つ!実は、うどんについては、一つの方法が実行されると、いつも一歩ずつです.
たとえば、下のtestCompute()は、実際にはcompute()として機能しています.
ログ処理もこの方法の一部です.
void testCompute () {
log();
startTrancation();
compute();
endTrancation();
log();
}
元々はログを追加するクラスがターゲットです.
私たちはカット面とターゲットオブジェクトを一緒に編むと、プロキシオブジェクトが得られます.
一つの要求が伝わってくると、プロキシオブジェクトはブロックされ、それによって対応する要求を処理します.
設定情報は、元の方法の前後に論理を追加し、ターゲットオブジェクトを呼び出す方法です.
2.どのようにしてその種類に、その方法はいつ追加のロジックを追加しますか?
定義で:
Pointcut:これらの方法はうどんを注入する行為が必要です.それは方法の集合です.
ジョインポイント:接続点の一つであるpointは複数のジョインポイントに対応しています.
アドバンス : あなたが追加するロジックは、位置を指定することができます.
アドバイザー :その方法でそのadviceを定義します.
3.どのように編まれていますか?つまり代理人を得るにはどうすればいいですか?
JDK動的エージェント機構JDKダイナミックエージェント実現原理 この文章は分析がはっきりしている.
Proxyの静的方法newProxyInstanceから始まります.三つのパラメータ:class[]interfaces、InvocationHandler handler Class Loader loader
三者の役割:
インターフェース あなたが代理したいインターフェースです.複数のインターフェースを代理できますが、インターフェースでなければなりません.具体的に実現できない種類です.
ハンドル: その中のinvokeの方法を通して、あなたは異なっている方法のために、adviceを添加することができます!反射でターゲットクラスの呼び出し方法
loader: クラスの読み込み環境
彼が生成した代理人を通じて、新しいクラスです.同じクラスの文書があります.彼の方法は代理のインターフェースの方法と同じです.これらのインターフェースを実現しなければならないからです.
ただ実現した場合は、handlerのinvoke()を呼び出す方法であり、これもなぜ以下のinvoke()がコールバック方式であり、ターゲットクラスの
ある方法の時は、invokeメソッドを呼び出します.
実際にこのように見ると、エージェントクラスとターゲットクラスは、同じインターフェースを実現しており、エージェントクラスはターゲットクラスに基づいて、対応する方法の実装に追加の操作を追加します.
しかし、エージェントの生成は事前に作成したコードではなく、実行時に動的に生成されることを確認してください.新しいクラスです.目標クラスとの継承は存在しません.
実現する関係
cglib:
バイトコードで操作!代理インターフェースだけに限定されません.
CGLOIBは、ターゲットクラスのサブクラスを生成し、親類非final修饰子の方法(機能強化)を書き換えることができる.
4.どうやってブロックしますか?
あるpointCutで指定された方法を呼び出すと、実質的にはエージェントのようなこの方法が呼び出されますが、エージェントの実装は、handlerのinvoke方法を呼び出すことによって行われます.
Jdkを通じて提供されるプロキシモードのように、InvocationHandlerインターフェースを実現しなければなりません.
のコールバック方法は、タンジェントが実行されるかどうかに関係します.
SpringのAOPの中で、私達は自分でInvocationHandlerを実現する必要がなくて、私達のしたいのはうどんを定義します.
配置ファイルでspringを教えてください.これらの方法のこれらのところにadviceを追加したいです.
そして、springはこれらのadviceをブロックチェーンに追加します.フィルタのようです.
チューニング方法invoke()を呼び出すと、このブロックチェーンを使います.そして、このブロックチェーンを巡回します.これを見てください.
方法の中で第一にあなたのこのスクリーンセーバー(advisor)かどうか、それから再帰的に呼び出される過程です.
JdkDynamic Proxy invoke():
//要求の方法をブロックに加える.
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
5.代理先はいつ生成されましたか?ライフサイクル
<context:annotation-config/>
<context:component-scan base-package="com.bjsxt"/>
<bean id = "litcpt" class="com.bjsxt.aop.LogInterceptor" />
<aop:config>
<aop:aspect id="logAsp" ref="litcpt">
<aop:pointcut expression="execution(* com.bjsxt.dao..*.*(..))" id="pointCut"/>
<aop:before method="Before" pointcut-ref="pointCut"/>
</aop:aspect>
</aop:config>
上のような配置は、初期化時にDAOのプロキシを生成しますか?初期化すると生成されます.
スプリング容器を起動する時に何が発生しましたか?
实例化bean 解析aop:configの構成は、切り込み点式に解析されると、切り込み点式のクラスとSpring容器のクラスをマッチングさせ、プロキシオブジェクトの生成に成功した(通知+ターゲット方法)と一致する.
代理オブジェクトを生成する時、Springはターゲットクラスがインターフェースを実現しているかどうかを検査します.もしあるなら、JDK Proxyを採用して代理オブジェクトを生成します.いいえ、CGlibを採用して代理対象を生成します. テストクラスでctx.getBenを呼び出した時に発生したことは何ですか?取りたいbeanがプロキシオブジェクトを持っていて、ない場合は対象自体に戻ります.