AnnotationAwareAspectJAutoProxyCreator類是干嘛的?
停更了很久的【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()方法,然后在AbstractAdvisorAutoProxyCreator類中的setBeanFactory()方法中調用initBeanFactory()方法。由于在子類AnnotationAwareAspectJAutoProxyCreator中重寫了initBeanFactory()方法,最終調用的就是AnnotationAwareAspectJAutoProxyCreator類中的initBeanFactory()方法。這么說有點繞,我們來看一張圖吧。
注意,上圖中的AbstractAdvisorAutoProxyCreator類中的setBeanFactory()方法作為程序調用的入口,它會依次調用AbstractAutoProxyCreator#setBeanFactory() 和 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory() ,然后,再由 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory() 調用 AbstractAdvisorAutoProxyCreator#initBeanFactory()。
除此之外,我們在AnnotationAwareAspectJAutoProxyCreator類中,并沒有發現與后置處理器相關的代碼了。
好了,以上就是我們分析的有關AnnotationAwareAspectJAutoProxyCreator類的源碼。在下一篇文章中,我們開始debug調試這些源代碼的具體執行流程。
本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。