【第六章】AOPの6.9代理メカニズム——私とspring 3【塾オンラインオリジナル】を学ぶ

1123 ワード

Spring AOPはエージェントモードによって実現され、現在は2つのエージェントをサポートしている:JDKダイナミックエージェント、CGLIBエージェントはAOPエージェントを作成し、SpringはJDKダイナミックエージェントを優先的に使用することを提案する.
  • JDK動的エージェント:java.lang.reflect.Proxy動的エージェントを使用して実装します.つまり、ターゲットオブジェクトのインタフェースを抽出し、インタフェースにAOPエージェントを作成します.
  • CGLIBエージェント:CGLIBエージェントはインタフェースエージェントだけでなくクラスエージェントも可能であり、CGLIBエージェントは以下の問題に注意する必要がある:
  •        finalメソッドは上書きできないためfinalメソッドに通知できません(CGLIBはサブクラスを生成することによってエージェントを作成します).
           2回のコンストラクタ呼び出しが発生します.1回目はターゲットクラスのコンストラクタ呼び出し、2回目はCGLIBで生成されたエージェントクラスのコンストラクタ呼び出しです.CGLIBエージェントメソッドが必要な場合は、2回のコンストラクタ呼び出しがアプリケーションに影響しないことを確認します.
     
    Spring AOPのデフォルトでは、まずJDKダイナミックエージェントを使用してターゲットオブジェクトをエージェントします.ターゲットオブジェクトがインタフェースを実装していない場合はCGLIBエージェントを使用します.CGLIBエージェントを強制的に使用する必要がある場合は、次のように指定します.
    Schemaスタイルのコンフィギュレーションスライスでは、CGLIBエージェントの使用方法を指定します.
     
    JAvaコード:
    <aop:config proxy-target-class="true">
    </aop:config>
     
    一方、@AspectJスタイルを使用する場合は、CGLIBエージェントの使用を指定します.
     
    JAvaコード:
    <aop:aspectj-autoproxy proxy-target-class="true"/>