Spring AOPの下のソースコードの詳細


ProxyFactoryの仕事原理
ProxyFactoryは代理先の生産工場で、代理先を生成する前に代理工場を配置する必要があります。ProxyFactoryは、エージェントを生成する前に、JDK動的エージェントを使うか、それともCGLOIB技術を使うかを決定する必要があります。

// config  ProxyFactory  
// optimize true, proxyTargetClass true,      ProxyFactory    interface
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
  Class<?> targetClass = config.getTargetClass();
  if (targetClass == null) {
    throw new AopConfigException("TargetSource cannot determine target class: " +
        "Either an interface or a target is required for proxy creation.");
  }
  // targetClass   ,    Jdk    
  if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
    return new JdkDynamicAopProxy(config);
  }
  //   Cglib
  return new ObjenesisCglibAopProxy(config);
}
else {
  //   Jdk    
  return new JdkDynamicAopProxy(config);
}
JdkDynamicAopProxy作成代理対象プロセス
  • は、プロキシオブジェクトを生成するために必要とされるインターフェースセット
  • を取得する。
  • ProxyFactory.addInterface()によって追加されたインターフェースを取得し、ProxyFactory.addInterface()にインターフェースを追加していない場合はProxyFactoryを参照してください。set Target Classに設定されているtarget Classはインターフェースではなく、結果セットにインターフェースを追加し、同時にSpring Proxy、Advided、Decorating Proxyというインターフェースも結果セットに追加されます。
  • エージェントの集合が確定したら、Proxy.newProxyInstanceを利用してプロキシオブジェクトを生成する。
  • JdkDynamicAopProxy作成代行対象執行過程
  • ProxyFactory.set ExposeProxy()を通じてexposeProxyをtrueに設定すると、代理先をThreadLocal(currentProxy)に設定します。
  • は、ProxyFactoryによって設定されたtargetを取得し、もしtarget Classが設定されているならば、targetはnull
  • になります。
  • 現在呼び出されている方法の対象に従ってProxyFactoryに添付されているAdvisorを探し、AdvisorをMethodInterceptorにパッケージして返します。MethodIntercepterチェーンを取得することをchain
  • といいます。
  • チャインが空であれば、バイトはタージ対応の現在の方法を実行し、タージがnullであれば
  • にエラーが発生する。
  • chainが空でないと、chain中のMethodIntercepterが順次実行されます。現在のMethodIntercepterがMethodBeforeAdvice Intercepterであれば、Advisorのadviceのbefore()メソッドを実行して、次のMethodInterceptorを実行します。現在のMethodIntercepterがAfterReturningAdvice Interceptorであれば、先に次のMethat Internetを実行します。戻り値を取ったら、AdvisorのadviceのafterReturningを実行します。
  • Objness CglibAopProxy作成代理対象プロセス
  • Enhancer
  • を作成します。
  • Enhancerを設置するスーパークラスは、ProxyFactory.set Target()によって設定されたオブジェクトのクラス
  • である。
  • Enhancerのinterfacesは、ProxyFactory.addInterface()を介して追加されたインターフェースと、Spring Proxy、Advisorインターフェース
  • である。
  • Enhancerを設置するCallbacksはDynamicAdviediIntercepter
  • です。
  • 最後にEnhancerを通じてプロキシオブジェクトを作成します。
  • Objnese isCglibAopProxyが作成したプロキシ実行プロセス
    実行過程は主にDynamicAdvided Intercepterの中の実現を見て、実行ロジックはJdkDynamicAopProxyの中と同じです。
    自動代理機能
    「自動代理」とはSpringにビーンを追加する必要があるという意味で、このビーンはBeanPostProcessorであり、Springはビーンを作成するたびに、このビーンPost Processorの判断を経て、現在作成中のこのビーンがAOPを行う必要があるかどうかを判断します。
    Default AdvisoorAutoxyCreator
    AbstractAutoProxyCreatorはSmart InstantiationAwareBeanPostProcessorインターフェースを実現しました。
  • は、あるビーンの実装前に、このAbstractAutoProxyCreatorにCustoomTarget Sourceが設定されているかどうかを確認し、設定されているならば、現在のBenがTarget Sourceを作成する必要があるかどうかを確認し、必要であれば、Target Sourceオブジェクトを作成し、AOPを実行して代理体を作成し、このオブジェクト247956627に戻る。
  • 、あるビーンがサイクル依存を持っている場合、getEarlyBenReference()方法を利用して、AOP
  • を事前に行う。
  • は、あるBeanが初期化された後、wrapIfNecessary()メソッドを呼び出してAOP
  • を行う。
  • はこのクラスで抽象的な方法を提供しています。getAdvice AndAdvisors ForBen()は、どのようなAdviceとAdvisorsがビーンにマッチしているかを表しています。
  • AbstractAdvisor AutoProxyCreatorはAbstract AutoxyCreatorを継承しています。Abstract Advideo AutoProxyCreatorでは、getAdvice AndAdAdvisors ForBenを実現しました。
  • findEligible Advisorsを呼び出します。
  • findCandCanddateAdvisorsを呼び出して、すべてのAdvisorタイプのBeanを得ます。ビーンのライフサイクルを現在進行中のビーンでフィルタリングします。
  • @EnbaleAsppectJAtoProxy
    この注釈は主にAnnotationAwareAspect JAtoxyCreatorタイプのBeanDefinitionを追加しました。Aspect JAwareAdvisor AutoProxyCreatorはAbstract Advisorを継承し、ショルダーdSkipを書き直しました。beanClass、String beanName)方法は、あるbeanがAOPを行う必要があるかどうかを表しています。
  • はすべてのAdvisor
  • を持ちます。
  • はすべてのAdvisorを巡回して、もし現在beanはAspect JPoid ntcutAdvisorだならば、それではスキップします。
  • AnnotationAwareAspect JAtoxyCreatorはAspect JAwareAdvisorを継承しています。findCanddidateAdvisors()の方法を書き直しました。Advisorタイプのbeanを見つけることができます。すべての@Asppect注釈表示の種類をスキャンしてAdvisorを生成することができます。
    注解とソースの対応関係
    @BeforeはAspectJMethodBeforeAdviceに対応しています。直接MethodBefore Adviceを実現します。動的エージェントを行う時にAspect JMethodBefore AdviceをMethodBefore Advice Interceptorに変えます。MethodBefore Advice Intercepterにも変わりました。
  • まずadvice対応の方法を実行する
  • MethodInvocationのproced()を再実行すると、次のInterceptorが実行されます。次のInterceptorがない場合、target対応の方法が実行されます。
  • @After対応はAsppectJAfter Adviceで、直接MethodInterceptorを実現しました。
  • まずMethodInvocationのプロシージャーを実行します。次のIntercepterがない場合、target対応の方法を実行します。
  • アドヴィス対応を再実行する方法
  • @Around対応はAspect JAroundAdddviceで、直接Method Interceptorを実現しました。
    直接advice対応を実行する方法
    @After Throwing対応はAspectJAfter ThrowingAdviceで、直接Method Interceptorを実現しました。
  • まずMethodInvocationのプロシージャーを実行します。次のIntercepterがない場合、target対応の方法を実行します。
  • もし上にThrowableを投げたら、advice対応の方法を実行します。
  • @AfterReturningはAsppectJAfterReturningAdviceに対応しています。After ReturningAdviceを実現しました。動的エージェントを行う時にAsppectJAfterReturningAdviceをAdverReturningAdvice Interceptorに変更します。
  • まずMethodInvocationのプロシージャーを実行します。次のIntercepterがない場合、target対応の方法を実行します。
  • は、上記の方法を実行した後、最終的な方法の戻り値
  • を得る。
  • 再度Advice対応を実行する方法
  • 以上はSpring AOPの下のソースコードの詳細な内容です。Spring AOPの下のソースコードに関する資料は他の関連記事に注目してください。