关于Spring的AnnotationAwareAspectJAutoProxyCreator类解析

 更新时间:2023年05月11日 10:37:30   作者:冰 河  
这篇文章主要介绍了关于Spring的AnnotationAwareAspectJAutoProxyCreator类解析,Spring是一个开源免费的框架 , 容器,是一个轻量级的框架 ,需要的朋友可以参考下

通过查看@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()方法,如下所示。

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

到此这篇关于关于Spring的AnnotationAwareAspectJAutoProxyCreator类解析的文章就介绍到这了,更多相关Spring的AnnotationAwareAspectJAutoProxyCreator类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 史上最全的java随机数生成算法分享

    史上最全的java随机数生成算法分享

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法
    2014-01-01
  • JAVA之反射机制Reflection的使用

    JAVA之反射机制Reflection的使用

    这篇文章主要介绍了JAVA之反射机制Reflection的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Spring Task 动态修改任务执行计划cron方式

    Spring Task 动态修改任务执行计划cron方式

    这篇文章主要介绍了Spring Task 动态修改任务执行计划cron方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)

    Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)

    下面小编就为大家带来一篇Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • IDEA的基本使用(让你的IDEA有飞一般的感觉)

    IDEA的基本使用(让你的IDEA有飞一般的感觉)

    这篇文章主要介绍了IDEA的基本使用(让你的IDEA有飞一般的感觉),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java中具有映射关系的容器:数组和Map的区别说明

    Java中具有映射关系的容器:数组和Map的区别说明

    这篇文章主要介绍了Java中具有映射关系的容器:数组和Map的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot全局异常处理之解决404/500错误

    SpringBoot全局异常处理之解决404/500错误

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息,这篇文章主要给大家介绍了关于SpringBoot全局异常处理之解决404/500错误的相关资料,需要的朋友可以参考下
    2023-11-11
  • Java中获取时间戳的三种方式对比实现

    Java中获取时间戳的三种方式对比实现

    这篇文章主要介绍了Java中获取时间戳的三种方式对比实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • spring基础概念AOP与动态代理理解

    spring基础概念AOP与动态代理理解

    这篇文章主要为大家详细介绍了spring基础概念AOP与动态代理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • SpringBoot使用Sa-Token实现权限认证

    SpringBoot使用Sa-Token实现权限认证

    本文主要介绍了SpringBoot使用Sa-Token实现权限认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论