アドバイス:提案されたペア。これは、アドバイスとポイントカットがアドバイザーによってリンクされていることを意味します。これらのアドバイザはaopエージェントのターゲットにバインドされます。aopエージェントが特定のメソッドを実行すると、すべてのアドバイザのメソッドに一致するアドバイザと一致し、これらのアドバイザはパッケージングファクトリMethodInterceptorによって返されます。JdkDynamicAopProxy
またはObjenesisCglibAopProxy会依次执行这些拦截器。下面就是JdkDynamicAopProxy中invoke方法获取这些方法拦截器并委托给
、CGLIBのReflectiveMethodInvocation実行に基づくソースコード。ReflectiveMethodInvocationは、責任連鎖モデルを採用して、各MethodInterceptorを順番に実行します。
List <Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method、targetClass); //アドバイスがあるかどうかを確認します。そうでない場合は 、ターゲットの直接//リフレクティブ呼び出しにフォールバックし、MethodInvocationの作成を回避できます。 if(chain.isEmpty()){ // MethodInvocationの作成をスキップできます:ターゲットを直接呼び出すだけです //最後の呼び出し元はInvokerInterceptorである必要があるため、//ターゲットに対するリフレクティブ操作のみを実行することがわかります 。ホットスワップや派手なプロキシはありません。 Object [] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method、args); retVal = AopUtils.invokeJoinpointUsingReflection(target、method、argsToUse); } else { //メソッド呼び出しを作成する必要があります... invocation = new ReflectiveMethodInvocation(proxy、target、method、args、targetClass、chain); //インターセプターチェーンを介してジョインポイントに進みます。 retVal = invocation.proceed(); }
JdkDynamicAopProxy
Springによって生成されるプロキシオブジェクトは、JDKまたはCGLIBベースのObjenesisCglibAopProxy,spring内部是委托给
DefaultAopProxyFactoryに基づいてプロキシオブジェクトを生成することがわかっています。ソースコードは次のとおりです。
public AopProxy createAopProxy(AdvisedSupport config)throws AopConfigException { if(config.isOptimize()|| config.isProxyTargetClass()|| hasNoUserSuppliedProxyInterfaces(config)){ Class <?> targetClass = config.getTargetClass(); if(targetClass == null){ throw new AopConfigException( "TargetSourceはターゲットクラスを判別できません:" + "プロキシの作成にはインターフェイスまたはターゲットのいずれかが必要です。"); } if(targetClass.isInterface()|| Proxy.isProxyClass(targetClass)){ return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { 新しいJdkDynamicAopProxy(config);を返します。 } }
このメソッドには、AdvisedSupportクラスのオブジェクトが必要です。
AdvisedSupport:AOPプロキシ構成マネージャーの基本クラス。これらはそれ自体がAOPプロキシではありませんが、そのようなサブクラスは通常、AOPプロキシインスタンスが直接取得されるファクトリです。このクラスは、AdvicesおよびAdvisorの内部管理サブクラスを解放できますが、実際にはエージェント作成メソッドを実装していませんが、サブクラスによって提供されます。このクラスは、エージェントのスナップショットを保存するために使用されます。
AdvisedSupportは、AdvisedでAdvisorとAdviceを処理するメソッドを実装します。Adviceを追加すると、Advisorにパッケージ化されます。使用されるデフォルトのAdvisorはDefaultPointcutAdvisorであり、DefaultPointcutAdvisorのデフォルトのPointcutはTruePointcutです(すべてのメソッド呼び出しに一致するAdvisorに変換されます。プロキシオブジェクトにバインドされています)。
AdvisedSupportは、特定のメソッドに対応するすべてのアドバイザ(Map <MethodCacheKey、List <Object >> methodCache)もキャッシュします。アドバイザまたはアドバイザが変更されると、キャッシュはクリアされます。
ProxyCreatorSupportはAdvisedSupportを継承し、ProxyCreatorSupportはプロキシを作成する方法であり、ProxyCreatorSupportにはメンバー変数AopProxyFactoryがあり、この変数の値はデフォルトでDefaultAopProxyFactoryです。
public ProxyCreatorSupport(){ this.aopProxyFactory = new DefaultAopProxyFactory(); }
ProxyCreatorSupport:List <AdvisedSupportListener>リスナースプリングには、このインターフェイスを実装するクラスがありません。これは主に、プロキシが初めて作成されたとき、またはプロキシが変更されたときにトリガーされます。 ProxyCreatorSupport:最初のAOPプロキシを作成した後にboolean activeがtrueに設定されます[createAopProxy()] ProxyFactoryはProxyCreatorSupportを継承し、springはデフォルトでProxyオブジェクトのファクトリクラスを作成します。このクラスには、プロキシを取得するための複数のオーバーロードされた構築メソッドと複数のオーバーロードされたメソッドがあります。
ProxyFactoryBean:AOPを実装するための宣言型/プログラミング型の方法で使用します。