写点什么

Spring 中这么重要的 AnnotationAwareAspectJAutoProxyCreator 类是干嘛的?

用户头像
冰河
关注
发布于: 4 小时前
Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?

大家好,我是冰河~~


停更了很久的【Spring 注解系列】专题,终于重新更新了,我们还是接着之前的文章继续往下更新。在《【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解》一文中,我们通过查看@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
复制代码


查看继承关系可以发现,此类实现了AwareBeanPostProcessor接口,这两个接口都和 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()方法,如下所示。


@Overridepublic void setBeanFactory(BeanFactory beanFactory) {    this.beanFactory = beanFactory;}
@Nullableprotected BeanFactory getBeanFactory() { return this.beanFactory;}
复制代码


果然,我们在 AbstractAutoProxyCreator 类中找到了 setBeanFactory()方法和 getBeanFactory()方法。


另外,在 AbstractAutoProxyCreator 类中还存在与 BeanPostProcessor 后置处理器有关的方法,分别为:postProcessBeforeInstantiation()、postProcessAfterInstantiation()、postProcessProperties()、postProcessBeforeInitialization()、postProcessAfterInitialization()。整体源代码如下所示。


@Overridepublic 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;}
@Overridepublic boolean postProcessAfterInstantiation(Object bean, String beanName) { return true;}
@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { return pvs;}
@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) { return bean;}
@Overridepublic 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类中,我们会看到如下代码。


@Overridepublic 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()方法,如下所示。


@Overrideprotected 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 调试这些源代码的具体执行流程。


好了,今天就到这儿吧,我是冰河,我们下期见~

发布于: 4 小时前阅读数: 3
用户头像

冰河

关注

公众号:冰河技术 2020.05.29 加入

Mykit系列开源框架发起者、核心架构师和开发者,《海量数据处理与大数据技术实战》与《MySQL开发、优化与运维实战》作者。【冰河技术】微信公众号作者。

评论

发布
暂无评论
Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?