Spring AOPの下のソースコードの詳細
ProxyFactoryの仕事原理
ProxyFactoryは代理先の生産工場で、代理先を生成する前に代理工場を配置する必要があります。ProxyFactoryは、エージェントを生成する前に、JDK動的エージェントを使うか、それともCGLOIB技術を使うかを決定する必要があります。は、プロキシオブジェクトを生成するために必要とされるインターフェースセット を取得する。 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の下のソースコードに関する資料は他の関連記事に注目してください。
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作成代理対象プロセス実行過程は主にDynamicAdvided Intercepterの中の実現を見て、実行ロジックはJdkDynamicAopProxyの中と同じです。
自動代理機能
「自動代理」とはSpringにビーンを追加する必要があるという意味で、このビーンはBeanPostProcessorであり、Springはビーンを作成するたびに、このビーンPost Processorの判断を経て、現在作成中のこのビーンがAOPを行う必要があるかどうかを判断します。
Default AdvisoorAutoxyCreator
AbstractAutoProxyCreatorはSmart InstantiationAwareBeanPostProcessorインターフェースを実現しました。
この注釈は主にAnnotationAwareAspect JAtoxyCreatorタイプのBeanDefinitionを追加しました。Aspect JAwareAdvisor AutoProxyCreatorはAbstract Advisorを継承し、ショルダーdSkipを書き直しました。beanClass、String beanName)方法は、あるbeanがAOPを行う必要があるかどうかを表しています。
注解とソースの対応関係
@BeforeはAspectJMethodBeforeAdviceに対応しています。直接MethodBefore Adviceを実現します。動的エージェントを行う時にAspect JMethodBefore AdviceをMethodBefore Advice Interceptorに変えます。MethodBefore Advice Intercepterにも変わりました。
直接advice対応を実行する方法
@After Throwing対応はAspectJAfter ThrowingAdviceで、直接Method Interceptorを実現しました。