成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

AnnotationAwareAspectJAutoProxyCreator類是干嘛的?

開發 前端
在 AnnotationAwareAspectJAutoProxyCreator類的繼承關系上可以看出, 是在AbstractAutoProxyCreator類開始實現 SmartInstantiationAwareBeanPostProcessor接口和 BeanFactoryAware 接口的。

[[386831]]

停更了很久的【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調試這些源代碼的具體執行流程。

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。

 

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2020-09-29 10:20:02

Java編程語言

2023-09-21 07:24:52

2025-05-08 09:10:00

2021-08-10 09:28:10

ViteES Modules Dev Server

2020-12-21 13:42:59

大數據大數據應用

2019-05-06 10:51:49

總監技術場景

2019-05-13 08:51:53

總監技術CTO

2019-04-26 13:55:02

Istio微服務架構

2025-06-26 03:33:00

2021-03-22 10:20:04

Python元類代碼

2017-08-24 13:10:09

IT

2019-12-09 15:08:30

JavaTomcatWeb

2010-09-27 14:28:56

DHCP服務器

2023-01-28 10:40:56

Java虛擬機代碼

2019-01-29 11:08:48

NginxApacheHTTP協議

2018-09-01 15:56:40

八類網線雙絞線網線

2020-12-04 10:11:26

Unsafejava并發包

2023-12-06 12:11:43

類加載器雙親委派模型

2009-08-14 15:42:11

什么是.NET接口.NET抽象類

2021-05-08 09:02:19

Java加載器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 性一交一乱一伦视频免费观看 | 欧美日韩亚洲系列 | 久久噜噜噜精品国产亚洲综合 | 久久国产综合 | 国产永久免费 | 国产乱码精品1区2区3区 | 午夜精品久久久久久久久久久久久 | 国产精品成av人在线视午夜片 | 超碰97在线免费 | 日韩久久久久久 | 免费观看国产视频在线 | 完全免费在线视频 | 国产一区二区三区四区hd | 网站黄色在线 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 日韩视频高清 | 欧美xxxx在线| 亚洲一区二区三区在线播放 | 色视频www在线播放国产人成 | 亚洲精品久久久久久久久久久久久 | av黄色在线 | 亚洲精品视频观看 | 亚洲精品久久久久久久久久久 | 中文在线а√在线8 | 亚洲国产精品久久 | 国产一级视频在线 | 91福利网址 | 欧美精品tv | 国产一级在线观看 | 黄色免费在线观看网址 | 久久精品视频网站 | 成人a在线观看 | 91亚洲精品在线观看 | 亚洲精品福利视频 | 久久久久国产一区二区三区 | 一区二区三区精品 | 亚洲欧美激情网 | 欧美aaa| 91原创视频在线观看 | 亚洲精品一区二区三区四区高清 | 精品日韩在线 |