關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類解析
通過查看@EnableAspectJAutoProxy
注解的源碼,如下所示。
package org.springframework.context.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default false; boolean exposeProxy() default false; }
得知,@EnableAspectJAutoProxy
注解是通過使用@Import(AspectJAutoProxyRegistrar.class)
給容器中注冊一個名字叫做internalAutoProxyCreator = AnnotationAwareAspectJAutoProxyCreator
的組件。
并且我們也分析了AnnotationAwareAspectJAutoProxyCreato類的核心繼承關(guān)系,如下所示。
AnnotationAwareAspectJAutoProxyCreator --AspectJAwareAdvisorAutoProxyCreator --AbstractAdvisorAutoProxyCreator --AbstractAutoProxyCreator -- ProxyProcessorSupport, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
查看繼承關(guān)系可以發(fā)現(xiàn),此類實現(xiàn)了Aware
與BeanPostProcessor
接口,這兩個接口都和Spring bean的初始化有關(guān),由此推測此類主要處理方法都來自這兩個接口的實現(xiàn)方法。同時該類也實現(xiàn)了order方法。
那今天,我們就來看看AnnotationAwareAspectJAutoProxyCreator
類的調(diào)用流程,具體來說,就是看看 ``AnnotationAwareAspectJAutoProxyCreator` 作為BeanPostProcessor做了哪些工作,作為BeanFactoryAware做了哪些工作。
分析AbstractAutoProxyCreator類
在 AnnotationAwareAspectJAutoProxyCreator
類的繼承關(guān)系上可以看出, 是在AbstractAutoProxyCreator
類開始實現(xiàn) SmartInstantiationAwareBeanPostProcessor
接口和 BeanFactoryAware
接口的。
所以,我們先來看看 AbstractAutoProxyCreator
類進行分析。
由 AbstractAutoProxyCreator
類的定義我們可以看出,AbstractAutoProxyCreator
類直接實現(xiàn)了SmartInstantiationAwareBeanPostProcessor
接口和 BeanFactoryAware
接口。
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
既然 AbstractAutoProxyCreator
實現(xiàn)了 BeanFactoryAware
接口, 那么 AbstractAutoProxyCreator
類中就一定存在setBeanFactory()方法,如下所示。
@Override public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; } @Nullable protected BeanFactory getBeanFactory() { return this.beanFactory; }
果然,我們在 AbstractAutoProxyCreator
類中找到了setBeanFactory()方法和getBeanFactory()方法。
另外,在 AbstractAutoProxyCreator
類中還存在與BeanPostProcessor后置處理器有關(guān)的方法,分別為:postProcessBeforeInstantiation()、postProcessAfterInstantiation()、postProcessProperties()、postProcessBeforeInitialization()、postProcessAfterInitialization()。整體源代碼如下所示。
@Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) { Object cacheKey = getCacheKey(beanClass, beanName); if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)){ if (this.advisedBeans.containsKey(cacheKey)) { return null; } if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return null; } } TargetSource targetSource = getCustomTargetSource(beanClass, beanName); if (targetSource != null) { if (StringUtils.hasLength(beanName)) { this.targetSourcedBeans.add(beanName); } Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource); Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource); this.proxyTypes.put(cacheKey, proxy.getClass()); return proxy; } return null; } @Override public boolean postProcessAfterInstantiation(Object bean, String beanName) { return true; } @Override public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { return pvs; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { return bean; } @Override public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { Object cacheKey = getCacheKey(bean.getClass(), beanName); if (this.earlyProxyReferences.remove(cacheKey) != bean) { return wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }
也就是說,在AbstractAutoProxyCreator
類中,存在后置處理器的邏輯。
到這,我們就在AbstractAutoProxyCreator
類中看到了BeanFactoryAware
的實現(xiàn)和后置處理器的實現(xiàn)。
接下來,我們再來看看AbstractAutoProxyCreator
的子類 AbstractAdvisorAutoProxyCreator
類。
分析AbstractAdvisorAutoProxyCreator類
在 AbstractAdvisorAutoProxyCreator
類中,我們會看到如下代碼。
@Override public void setBeanFactory(BeanFactory beanFactory) { super.setBeanFactory(beanFactory); if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { throw new IllegalArgumentException( "AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory); } initBeanFactory((ConfigurableListableBeanFactory) beanFactory); }
說明在AbstractAdvisorAutoProxyCreator
類中重寫了setBeanFactory()方法。并且在AbstractAdvisorAutoProxyCreator
類的setBeanFactory()方法中,首先會調(diào)用AbstractAutoProxyCreator
類中的setBeanFactory()方法。
在setBeanFactory()方法中會調(diào)用initBeanFactory()方法,initBeanFactory()方法的實現(xiàn)如下所示。
protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) { this.advisorRetrievalHelper = new BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory); }
initBeanFactory()方法的實現(xiàn)比較簡單,這里,我就不多說了。
另外,我們并沒有在AbstractAdvisorAutoProxyCreator
類中找到與后置處理器相關(guān)的方法。
接下來,我們繼續(xù)分析AbstractAdvisorAutoProxyCreator
類的子類AspectJAwareAdvisorAutoProxyCreator類。
分析AspectJAwareAdvisorAutoProxyCreator類
通過查看AspectJAwareAdvisorAutoProxyCreator
類的源碼,我們得知,在 AspectJAwareAdvisorAutoProxyCreator
類中沒有與后置處理器相關(guān)的代碼。所以,我們繼續(xù)向上分析 AspectJAwareAdvisorAutoProxyCreator
類的子類 AnnotationAwareAspectJAutoProxyCreator
。
分析AnnotationAwareAspectJAutoProxyCreator類
在 AnnotationAwareAspectJAutoProxyCreator
類中,我們可以找到一個initBeanFactory()方法,如下所示。
@Override protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) { super.initBeanFactory(beanFactory); if (this.aspectJAdvisorFactory == null) { this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory); } this.aspectJAdvisorsBuilder = new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory); }
看到這里,小伙伴們對于setBeanFactory的調(diào)用流程有點清晰了吧?其實setBeanFactory()的調(diào)用流程為:首先會執(zhí)行 AbstractAdvisorAutoProxyCreator
類中的setBeanFactory()方法,在AbstractAdvisorAutoProxyCreator
類中的setBeanFactory()方法中會調(diào)用其父類AbstractAutoProxyCreator
中的setBeanFactory()方法,然后在AbstractAdvisorAutoProxyCreator
類中的setBeanFactory()方法中調(diào)用initBeanFactory()方法。由于在子類AnnotationAwareAspectJAutoProxyCreator
中重寫了initBeanFactory()方法,最終調(diào)用的就是AnnotationAwareAspectJAutoProxyCreator
類中的initBeanFactory()方法。這么說有點繞,我們來看一張圖吧。
注意,上圖中的AbstractAdvisorAutoProxyCreator
類中的setBeanFactory()方法作為程序調(diào)用的入口,它會依次調(diào)用AbstractAutoProxyCreator#setBeanFactory()
和 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory()
,然后,再由 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory()
調(diào)用 AbstractAdvisorAutoProxyCreator#initBeanFactory()
。
除此之外,我們在AnnotationAwareAspectJAutoProxyCreator
類中,并沒有發(fā)現(xiàn)與后置處理器相關(guān)的代碼了。
好了,以上就是我們分析的有關(guān)AnnotationAwareAspectJAutoProxyCreator
類的源碼。在下一篇文章中,我們開始debug調(diào)試這些源代碼的具體執(zhí)行流程。
到此這篇關(guān)于關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類解析的文章就介紹到這了,更多相關(guān)Spring的AnnotationAwareAspectJAutoProxyCreator類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在SpringBoot+Freemarker中獲取項目根目錄
這篇文章主要介紹了如何在SpringBoot+Freemarker中獲取項目根目錄的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10解決springboot jpa @Column columnDefinition等屬性失效問題
這篇文章主要介紹了解決springboot jpa @Column columnDefinition等屬性失效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10解決Spring boot2.0+配置攔截器攔截靜態(tài)資源的問題
這篇文章主要介紹了解決Spring boot2.0+配置攔截器攔截靜態(tài)資源的問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08Java 多線程Synchronized和Lock的區(qū)別
這篇文章主要介紹了Java 多線程Synchronized和Lock的區(qū)別,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01Spring Cloud應用實現(xiàn)配置自動刷新過程詳解
這篇文章主要介紹了Spring Cloud應用實現(xiàn)配置自動刷新過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12