关于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类的核心继承关系,如下所示。
AnnotationAwareAspectJAutoProxyCreator --AspectJAwareAdvisorAutoProxyCreator --AbstractAdvisorAutoProxyCreator --AbstractAutoProxyCreator -- ProxyProcessorSupport, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
查看继承关系可以发现,此类实现了Aware
与BeanPostProcessor
接口,这两个接口都和Spring bean的初始化有关,由此推测此类主要处理方法都来自这两个接口的实现方法。同时该类也实现了order方法。
那今天,我们就来看看AnnotationAwareAspectJAutoProxyCreator
类的调用流程,具体来说,就是看看 ``AnnotationAwareAspectJAutoProxyCreator` 作为BeanPostProcessor做了哪些工作,作为BeanFactoryAware做了哪些工作。
分析AbstractAutoProxyCreator类
在 AnnotationAwareAspectJAutoProxyCreator
类的继承关系上可以看出, 是在AbstractAutoProxyCreator
类开始实现 SmartInstantiationAwareBeanPostProcessor
接口和 BeanFactoryAware
接口的。
所以,我们先来看看 AbstractAutoProxyCreator
类进行分析。
由 AbstractAutoProxyCreator
类的定义我们可以看出,AbstractAutoProxyCreator
类直接实现了SmartInstantiationAwareBeanPostProcessor
接口和 BeanFactoryAware
接口。
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
既然 AbstractAutoProxyCreator
实现了 BeanFactoryAware
接口, 那么 AbstractAutoProxyCreator
类中就一定存在setBeanFactory()方法,如下所示。
@Override public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; } @Nullable protected BeanFactory getBeanFactory() { return this.beanFactory; }
果然,我们在 AbstractAutoProxyCreator
类中找到了setBeanFactory()方法和getBeanFactory()方法。
另外,在 AbstractAutoProxyCreator
类中还存在与BeanPostProcessor后置处理器有关的方法,分别为: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
的实现和后置处理器的实现。
接下来,我们再来看看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()方法中,首先会调用AbstractAutoProxyCreator
类中的setBeanFactory()方法。
在setBeanFactory()方法中会调用initBeanFactory()方法,initBeanFactory()方法的实现如下所示。
protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) { this.advisorRetrievalHelper = new BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory); }
initBeanFactory()方法的实现比较简单,这里,我就不多说了。
另外,我们并没有在AbstractAdvisorAutoProxyCreator
类中找到与后置处理器相关的方法。
接下来,我们继续分析AbstractAdvisorAutoProxyCreator
类的子类AspectJAwareAdvisorAutoProxyCreator类。
分析AspectJAwareAdvisorAutoProxyCreator类
通过查看AspectJAwareAdvisorAutoProxyCreator
类的源码,我们得知,在 AspectJAwareAdvisorAutoProxyCreator
类中没有与后置处理器相关的代码。所以,我们继续向上分析 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的调用流程有点清晰了吧?其实setBeanFactory()的调用流程为:首先会执行 AbstractAdvisorAutoProxyCreator
类中的setBeanFactory()方法,在AbstractAdvisorAutoProxyCreator
类中的setBeanFactory()方法中会调用其父类AbstractAutoProxyCreator
中的setBeanFactory()方法,然后在AbstractAdvisorAutoProxyCreator
类中的setBeanFactory()方法中调用initBeanFactory()方法。由于在子类AnnotationAwareAspectJAutoProxyCreator
中重写了initBeanFactory()方法,最终调用的就是AnnotationAwareAspectJAutoProxyCreator
类中的initBeanFactory()方法。这么说有点绕,我们来看一张图吧。
注意,上图中的AbstractAdvisorAutoProxyCreator
类中的setBeanFactory()方法作为程序调用的入口,它会依次调用AbstractAutoProxyCreator#setBeanFactory()
和 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory()
,然后,再由 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory()
调用 AbstractAdvisorAutoProxyCreator#initBeanFactory()
。
除此之外,我们在AnnotationAwareAspectJAutoProxyCreator
类中,并没有发现与后置处理器相关的代码了。
好了,以上就是我们分析的有关AnnotationAwareAspectJAutoProxyCreator
类的源码。在下一篇文章中,我们开始debug调试这些源代码的具体执行流程。
到此这篇关于关于Spring的AnnotationAwareAspectJAutoProxyCreator类解析的文章就介绍到这了,更多相关Spring的AnnotationAwareAspectJAutoProxyCreator类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!