【第六章】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コード:
一方、@AspectJスタイルを使用する場合は、CGLIBエージェントの使用を指定します.
JAvaコード:
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"/>