当前位置: 首页 > 科技观察

AnnotationAwareAspectJAutoProxyCreator类有什么用?

时间:2023-03-14 18:23:07 科技观察

停更久的【春季注解系列】话题,终于又更新了。packageorg.springframework.context.annotation;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar.class)public@interfaceEnableAspectJAutoProxy{booleanproxyTargetClass()defaultfalse;booleanexposeProxy()defaultfalse;}我了解到@EnableAspectJAutoProxy()defaultfalse;class)在容器中注册一个名为internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator的组件。并且我们还分析了AnnotationAwareAspectJAutoProxyCreato类的核心继承关系,如下图。AnnotationAwareAspectJAutoProxyCreator--AspectJAwareAdvisorAutoProxyCreator--AbstractAdvisorAutoProxyCreator--AbstractAutoProxyCreator--ProxyProcessorSupport,SmartInstantiationAwareBeanPostProcessor,BeanFactoryAware查看继承关系可以发现这个类实现了Aware和BeanPostProcessor接口,这两个接口都是Spring初始化相关的bean处理方法来自于这两个接口的实现方法。同时,该类还实现了order方法。今天我们就来看看AnnotationAwareAspectJAutoProxyCreator类的调用过程。具体来说,我们将看看“AnnotationAwareAspectJAutoProxyCreator”作为BeanPostProcessor的作用以及它作为BeanFactoryAware的作用。从AnnotationAwareAspectJAutoProxyCreator类的继承关系可以看出AbstractAutoProxyCreator类。正是在AbstractAutoProxyCreator类中实现了SmartInstantiationAwareBeanPostProcessor接口和BeanFactoryAware接口。那么,我们就来看看AbstractAutoProxyCreator类进行分析。从AbstractAutoProxyCreator类的定义可以看出,AbstractAutoProxyCreator类直接实现了SmartInstantiationAwareBeanPostProcessor接口和BeanFactoryAware接口。publicabstractclassAbstractAutoProxyCreatorextendsProxyProcessorSupportimplementsSmartInstantiationAwareBeanPostProcessor,BeanFactoryAware{由于AbstractAutoProxyCreator实现了BeanFactoryAware接口,所以AbstractAutoProxyCreator类中必须有一个setBeanFactory()方法,如下所示。@OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory){this.beanFactory=beanFactory;}@NullableprotectedBeanFactorygetBeanFactory(){returnthis.beanFactory;}果然,我们在AbstractAutoProxyCreator类中找到了setBeanFactory()和getBeanFactory()方法。此外,在AbstractAutoProxyCreator类中还有BeanPostProcessor后处理器相关的方法,分别是:postProcessBeforeInstantiation()、postProcessAfterInstantiation()、postProcessProperties()、postProcessBeforeInitialization()、postProcessAfterInitialization()。整体源码如下所示。@OverridepublicObjectpostProcessBeforeInstantiation(ClassbeanClass,StringbeanName){ObjectcacheKey=getCacheKey(beanClass,beanName);if(!StringUtils.hasLength(beanName)||!this.targetSourcedBeans.contains(beanName)){if(this.advisedBeans.containsKey(cacheKey)){returnnull;}if(isInfrastructureClass(beanClass)||shouldSkip(beanClass,beanName)){this.advisedBeans.put(cacheKey,Boolean.FALSE);returnnull;}}TargetSourcetargetSource=getCustomTargetSource(beanClass,beanName);if(targetSource!=null){if(StringUtils.hasLength(beanName)){this.targetSourcedBeans.add(beanName);}Object[]specificInterceptors=getAdvicesAndAdvisorsForBean(beanClass,beanName,targetSource);Objectproxy=createProxy(beanClass,beanName,specificInterceptors,targetSource);this.proxyTypes.put(cacheKey,proxy.getClass());returnproxy;}returnull;}@OverridepublicbooleanpostProcessAfterInstantiation(Objectbean,StringbeanName){returntrue;}@OverridepublicPropertyValuespostProcessProperties(属性yValuespvs,Objectbean,StringbeanName){returnpvs;}@OverridepublicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName){returnbean;}@OverridepublicObjectpostProcessAfterInitialization(@NullableObjectbean,StringbeanName){if(bean!=null){ObjectcacheKey=getCacheKey(beanName)(bean.get);if(this.earlyProxyReferences.remove(cacheKey)!=bean){returnwrapIfNecessary(bean,beanName,cacheKey);}}returnbean;}也就是说,在AbstractAutoProxyCreator类中,这里有后处理器逻辑,我们刚刚看到BeanFactoryAware的实现和AbstractAutoProxyCreator类中后处理器的实现。接下来我们看一下AbstractAdvisorAutoProxyCreator,它是AbstractAutoProxyCreator的一个子类。AbstractAdvisorAutoProxyCreator类在AbstractAdvisorAutoProxyCreator类中,我们将看到如下代码。@OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory){super.setBeanFactory(beanFactory);if(!(beanFactoryinstanceofConfigurableListableBeanFactory)){thrownewIllegalArgumentException("AdvisorAutoProxyCreatorrequiresaConfigurableListableBeanFactory:"+beanFactory);}initBeanFactory((ConfigurableListableBeanFactory)beanFactory);}说明在AbstractAdvisorAutoProxyCreator类中重写了setBeanFactory()方法。而在AbstractAdvisorAutoProxyCreator类的setBeanFactory()方法中,会先调用AbstractAutoProxyCreator类中的setBeanFactory()方法。在setBeanFactory()方法中调用了initBeanFactory()方法,initBeanFactory()方法的实现如下所示。protectedvoidinitBeanFactory(ConfigurableListableBeanFactorybeanFactory){this.advisorRetrievalHelper=newBeanFactoryAdvisorRetrievalHelperAdapter(beanFactory);}initBeanFactory()方法的实现比较简单,这里就不多说了。另外,我们在AbstractAdvisorAutoProxyCreator类中也没有找到后置处理器相关的方法。接下来我们继续分析AbstractAdvisorAutoProxyCreator类的子类AspectJAwareAdvisorAutoProxyCreator。AspectJAwareAdvisorAutoProxyCreator类通过查看AspectJAwareAdvisorAutoProxyCreator类的源代码,我们知道AspectJAwareAdvisorAutoProxyCreator类中并没有任何后处理器相关的代码。于是,我们继续分析AspectJAwareAdvisorAutoProxyCreator类的子类AnnotationAwareAspectJAutoProxyCreator。AnnotationAwareAspectJAutoProxyCreator类在AnnotationAwareAspectJAutoProxyCreator类中,我们可以找到一个initBeanFactory()方法,如下所示。@OverrideprotectedvoidinitBeanFactory(ConfigurableListableBeanFactorybeanFactory){super.initBeanFactory(beanFactory);if(this.aspectJAdvisorFactory==null){this.aspectJAdvisorFactory=newReflectiveAspectJAdvisorFactory(beanFactory);}this.aspectJAdvisorsBuilder=newBeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory,this.aspectJAdvisorFactory);}看到这里各位,setBeanFactory的调用过程是不是有点清楚了?其实setBeanFactory()的调用过程是:首先会执行AbstractAdvisorAutoProxyCreator类中的setBeanFactory()方法,在AbstractAdvisorAutoProxyCreator类中的setBeanFactory()方法中调用其父类中的setBeanFactory()方法AbstractAutoProxyCreator,然后在AbstractAdvisorAutoProxyCreator类的setBeanFactory()方法中调用initBeanFactory()方法。由于在子类AnnotationAwareAspectJAutoProxyCreator中重写了initBeanFactory()方法,所以最终调用了AnnotationAwareAspectJAutoProxyCreator类中的initBeanFactory()方法。所以说的有点绕,我们来看一张图。注意上图中AbstractAdvisorAutoProxyCreator类中的setBeanFactory()方法作为程序调用的入口。它会依次调用AbstractAutoProxyCreator#setBeanFactory()和AnnotationAwareAspectJAutoProxyCreator#initBeanFactory(),然后通过AnnotationAwareAspectJAutoProxyCreator#initBeanFactory()调用AbstractAdvisorAutoProxyCreator#initBeanFactory())。另外,我们在AnnotationAwareAspectJAutoProxyCreator类中也没有发现后处理器相关的代码。好了,以上就是我们分析的AnnotationAwareAspectJAutoProxyCreator类的源码。在下一篇文章中,我们将开始调试这些源码的具体执行过程。本文转载自微信公众号“冰河科技”,可通过以下二维码关注。转载本文请联系冰川科技公众号。