どのようにAOPを理解しますか

4373 ワード

面接の時、spring AOPについて話してくださいませんか?
       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がプロキシオブジェクトを持っていて、ない場合は対象自体に戻ります.