应用开发

AnnotationAwareAspectJAutoProxyCreator类是干嘛的?

时间:2010-12-5 17:23:32  作者:人工智能   来源:系统运维  查看:  评论:0
内容摘要:停更了很久的【Spring注解系列】专题,终于重新更新了。packageorg.springframework.context.annotation;importjava.lang.annotatio

停更了很久的类干【Spring注解系列】专题,终于重新更新了。类干

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()方法,云南idc服务商然后在AbstractAdvisorAutoProxyCreator类中的setBeanFactory()方法中调用initBeanFactory()方法。由于在子类AnnotationAwareAspectJAutoProxyCreator中重写了initBeanFactory()方法,最终调用的就是AnnotationAwareAspectJAutoProxyCreator类中的initBeanFactory()方法。这么说有点绕,我们来看一张图吧。

注意,上图中的AbstractAdvisorAutoProxyCreator类中的setBeanFactory()方法作为程序调用的入口,它会依次调用AbstractAutoProxyCreator#setBeanFactory() 和 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory() ,然后,再由 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory() 调用 AbstractAdvisorAutoProxyCreator#initBeanFactory()。

除此之外,我们在AnnotationAwareAspectJAutoProxyCreator类中,并没有发现与后置处理器相关的代码了。

好了,以上就是我们分析的有关AnnotationAwareAspectJAutoProxyCreator类的源码。在下一篇文章中,我们开始debug调试这些源代码的具体执行流程。

本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。

copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap