文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

AnnotationAwareAspectJAutoProxyCreator类是干嘛的?

2024-12-03 09:48

关注

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

  1. package org.springframework.context.annotation; 
  2. import java.lang.annotation.Documented; 
  3. import java.lang.annotation.ElementType; 
  4. import java.lang.annotation.Retention; 
  5. import java.lang.annotation.RetentionPolicy; 
  6. import java.lang.annotation.Target; 
  7. @Target(ElementType.TYPE) 
  8. @Retention(RetentionPolicy.RUNTIME) 
  9. @Documented 
  10. @Import(AspectJAutoProxyRegistrar.class) 
  11. public @interface EnableAspectJAutoProxy { 
  12.  boolean proxyTargetClass() default false
  13.  boolean exposeProxy() default false

得知,@EnableAspectJAutoProxy注解是通过使用@Import(AspectJAutoProxyRegistrar.class) 给容器中注册一个名字叫做internalAutoProxyCreator = AnnotationAwareAspectJAutoProxyCreator的组件。

并且我们也分析了AnnotationAwareAspectJAutoProxyCreato类的核心继承关系,如下所示。

  1. AnnotationAwareAspectJAutoProxyCreator 
  2.       --AspectJAwareAdvisorAutoProxyCreator 
  3.         --AbstractAdvisorAutoProxyCreator 
  4.           --AbstractAutoProxyCreator 
  5.             -- ProxyProcessorSupport, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware 

查看继承关系可以发现,此类实现了Aware与BeanPostProcessor接口,这两个接口都和Spring bean的初始化有关,由此推测此类主要处理方法都来自这两个接口的实现方法。同时该类也实现了order方法。

那今天,我们就来看看AnnotationAwareAspectJAutoProxyCreator 类的调用流程,具体来说,就是看看 ``AnnotationAwareAspectJAutoProxyCreator` 作为BeanPostProcessor做了哪些工作,作为BeanFactoryAware做了哪些工作。

AbstractAutoProxyCreator类

在 AnnotationAwareAspectJAutoProxyCreator类的继承关系上可以看出, 是在AbstractAutoProxyCreator类开始实现 SmartInstantiationAwareBeanPostProcessor接口和 BeanFactoryAware 接口的。

所以,我们先来看看 AbstractAutoProxyCreator 类进行分析。

由 AbstractAutoProxyCreator 类的定义我们可以看出,AbstractAutoProxyCreator类直接实现了SmartInstantiationAwareBeanPostProcessor 接口和BeanFactoryAware 接口。

  1. public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport 
  2.   implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware { 

既然 AbstractAutoProxyCreator 实现了 BeanFactoryAware 接口, 那么 AbstractAutoProxyCreator 类中就一定存在setBeanFactory()方法,如下所示。

  1. @Override 
  2. public void setBeanFactory(BeanFactory beanFactory) { 
  3.     this.beanFactory = beanFactory; 
  4.  
  5. @Nullable 
  6. protected BeanFactory getBeanFactory() { 
  7.     return this.beanFactory; 

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

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

  1. @Override 
  2. public Object postProcessBeforeInstantiation(Class beanClass, String beanName) { 
  3.     Object cacheKey = getCacheKey(beanClass, beanName); 
  4.     if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)){ 
  5.         if (this.advisedBeans.containsKey(cacheKey)) { 
  6.             return null
  7.         } 
  8.         if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) { 
  9.             this.advisedBeans.put(cacheKey, Boolean.FALSE); 
  10.             return null
  11.         } 
  12.     } 
  13.     TargetSource targetSource = getCustomTargetSource(beanClass, beanName); 
  14.     if (targetSource != null) { 
  15.         if (StringUtils.hasLength(beanName)) { 
  16.             this.targetSourcedBeans.add(beanName); 
  17.         } 
  18.         Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource); 
  19.         Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource); 
  20.         this.proxyTypes.put(cacheKey, proxy.getClass()); 
  21.         return proxy; 
  22.     } 
  23.     return null
  24.  
  25. @Override 
  26. public boolean postProcessAfterInstantiation(Object bean, String beanName) { 
  27.     return true
  28.  
  29. @Override 
  30. public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { 
  31.     return pvs; 
  32.  
  33. @Override 
  34. public Object postProcessBeforeInitialization(Object bean, String beanName) { 
  35.     return bean; 
  36.  
  37. @Override 
  38. public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { 
  39.     if (bean != null) { 
  40.         Object cacheKey = getCacheKey(bean.getClass(), beanName); 
  41.         if (this.earlyProxyReferences.remove(cacheKey) != bean) { 
  42.             return wrapIfNecessary(bean, beanName, cacheKey); 
  43.         } 
  44.     } 
  45.     return bean; 

也就是说,在AbstractAutoProxyCreator 类中,存在后置处理器的逻辑。

到这,我们就在AbstractAutoProxyCreator 类中看到了BeanFactoryAware 的实现和后置处理器的实现。

接下来,我们再来看看AbstractAutoProxyCreator 的子类 AbstractAdvisorAutoProxyCreator类。

AbstractAdvisorAutoProxyCreator类

在 AbstractAdvisorAutoProxyCreator类中,我们会看到如下代码。

  1. @Override 
  2. public void setBeanFactory(BeanFactory beanFactory) { 
  3.     super.setBeanFactory(beanFactory); 
  4.     if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { 
  5.         throw new IllegalArgumentException( 
  6.             "AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory); 
  7.     } 
  8.     initBeanFactory((ConfigurableListableBeanFactory) beanFactory); 

说明在AbstractAdvisorAutoProxyCreator类中重写了setBeanFactory()方法。并且在AbstractAdvisorAutoProxyCreator类的setBeanFactory()方法中,首先会调用AbstractAutoProxyCreator 类中的setBeanFactory()方法。

在setBeanFactory()方法中会调用initBeanFactory()方法,initBeanFactory()方法的实现如下所示。

  1. protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) { 
  2.     this.advisorRetrievalHelper = new BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory); 

initBeanFactory()方法的实现比较简单,这里,我就不多说了。

另外,我们并没有在AbstractAdvisorAutoProxyCreator类中找到与后置处理器相关的方法。

接下来,我们继续分析AbstractAdvisorAutoProxyCreator类的子类AspectJAwareAdvisorAutoProxyCreator类。

AspectJAwareAdvisorAutoProxyCreator类

通过查看AspectJAwareAdvisorAutoProxyCreator类的源码,我们得知,在 AspectJAwareAdvisorAutoProxyCreator类中没有与后置处理器相关的代码。所以,我们继续向上分析 AspectJAwareAdvisorAutoProxyCreator类的子类 AnnotationAwareAspectJAutoProxyCreator。

AnnotationAwareAspectJAutoProxyCreator类在 AnnotationAwareAspectJAutoProxyCreator类中,我们可以找到一个initBeanFactory()方法,如下所示。

  1. @Override 
  2. protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) { 
  3.     super.initBeanFactory(beanFactory); 
  4.     if (this.aspectJAdvisorFactory == null) { 
  5.         this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory); 
  6.     } 
  7.     this.aspectJAdvisorsBuilder = 
  8.         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调试这些源代码的具体执行流程。

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

 

来源: 冰河技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯