前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AnnotationAwareAspectJAutoProxyCreator类是干嘛的?

AnnotationAwareAspectJAutoProxyCreator类是干嘛的?

作者头像
冰河
发布于 2021-03-24 10:09:27
发布于 2021-03-24 10:09:27
1.6K00
代码可运行
举报
文章被收录于专栏:冰河技术冰河技术
运行总次数:0
代码可运行

停更了很久的【Spring注解系列】专题,终于重新更新了,我们还是接着之前的文章继续往下更新。在《【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解》一文中,我们通过查看@EnableAspectJAutoProxy 注解的源码,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类的核心继承关系,如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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 接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
  implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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()。整体源代码如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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类中,我们会看到如下代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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()方法的实现如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    this.advisorRetrievalHelper = new BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory);
}

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

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

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

AspectJAwareAdvisorAutoProxyCreator类

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

AnnotationAwareAspectJAutoProxyCreator类

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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调试这些源代码的具体执行流程。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰河技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)
上篇博文: 【小家Spring】面向切面编程之—Spring AOP的原理讲解以及源码分析(Cannot find current proxy: Set ‘exposeProxy’ property on ) 已经刚刚结合实例,介绍了Spring AOP的过程以及对源码进行了逐步分析~
YourBatman
2019/09/03
3K0
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)
【Spring注解驱动开发】AOP核心类源码解析,这是最全的一篇了!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
2860
【Spring注解驱动开发】AOP核心类源码解析,这是最全的一篇了!!
你知道Spring是怎么将AOP应用到Bean的生命周期中的吗?
在上篇文章中(Spring中AOP相关的API及源码解析,原来AOP是这样子的)我们已经分析过了AOP的实现的源码,那么Spring是如何将AOP应用到Bean的生命周期的呢?这篇文章就带着大家来探究下这个问题。本文我们要分析的代码还是位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean这个方法中,在《我们来谈一谈Spring中的属性注入 》这篇文章中,我们已经分析过了populateBean这个方法,
程序员DMZ
2020/07/05
1.8K0
spring5.x-AOP实现原理及源码分析
Spring AOP(Aspect-Oriented Programming)是 Spring 框架的一个重要特性,它提供了一种基于横切关注点的编程范式。AOP 允许开发人员将横切关注点(如日志记录、事务管理、安全性等)与核心业务逻辑分离,从而实现更好的代码结构和可维护性。
逍遥壮士
2023/09/01
2520
spring5.x-AOP实现原理及源码分析
Spring读源码系列之AOP--07---aop自动代理创建器(拿下AOP的最后一击)
本系列列举的源码中,很多类没有展开讲,是因为之前的系列文章一直在对aop基础组件进行介绍,因此一定要按照顺序看本系列,否则观看本篇文章的时候,越往后看,越发觉得本文模糊不清,只会粘贴源码,实则不然,因为很多类前文已经讲过,如果本文再展开讲解,那么将无法突出重点
大忽悠爱学习
2022/05/10
1.1K0
Spring读源码系列之AOP--07---aop自动代理创建器(拿下AOP的最后一击)
Spring源码学习笔记(9)——AOP
AOP的定义及一些术语相信大家已经很熟悉了,这里不再赘述。下面演示基于注解的Spring AOP开发。
张申傲
2020/09/03
3440
Spring之AOP源码理解,Spring4.3.12.RELEASE版本
1、AOP原理,核心从@EnableAspectJAutoProxy注解进行入手研究。
别先生
2020/01/02
3620
Spring AOP 原理源码深度剖析
概述 AOP(Aspect-Oriented Programming) 面向切面编程。Spring Aop 在 Spring框架中的地位举足轻重,主要用于实现事务、缓存、安全等功能。本篇主要是对源码进行深度分析。
方志朋
2019/06/21
1.1K0
你知道Spring是怎么将AOP应用到Bean的生命周期中的吗?
在上篇文章中(Spring中AOP相关的API及源码解析,原来AOP是这样子的)我们已经分析过了AOP的实现的源码,那么Spring是如何将AOP应用到Bean的生命周期的呢?这篇文章就带着大家来探究下这个问题。本文我们要分析的代码还是位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean这个方法中,在《我们来谈一谈Spring中的属性注入 》这篇文章中,我们已经分析过了populateBean这个方法,
程序员DMZ
2020/07/20
5890
你知道Spring是怎么将AOP应用到Bean的生命周期中的吗?
AOP源码解析(1)---Spring源码从入门到精通(十八)
上篇文章用代码实现了AOP功能日志打印,定义切面类,用@Aspect标注这是切面类,最后要记得用@EnableAspectAutoProxy注解启动切面功能模块。
用户9919783
2022/07/26
1940
AOP源码解析(1)---Spring源码从入门到精通(十八)
一文调试spring AOP源码
点开AspectJAutoProxyRegistrar类之后,会发现这里会注入bean的定义信息,那么定义那个bean呢? 下面一起一探揪净~~
简单的程序员
2020/07/15
5120
一文调试spring AOP源码
听说 Spring Bean 的创建还有一条捷径?
AbstractAutowireCapableBeanFactory#createBean:
江南一点雨
2023/09/09
2430
听说 Spring Bean 的创建还有一条捷径?
SpringAop源码分析(基于注解)三:创建代理对象
我们先回到Bean初始化之后,调用BeanPostProcessor后置处理器的地方。
周同学
2019/10/24
4460
Spring的AOP底层解析
            基于两种动态代理技术,在Spring中进行了封装,封装出来的类叫做ProxyFactory,表示是创建代理对象的一个工厂,使用起来会更加方便。
忧愁的chafry
2022/10/30
5240
Spring的AOP底层解析
基于注解的SpringAOP源码解析(二)
在上篇文章中我们搭建了一个阅读源码的demo工程,然后简单介绍了一下@EnableAspectJAutoProxy注解,这个注解最重要的功能就是为向Spring中注入了一个beanAnnotationAwareAspectJAutoProxyCreator,本篇文章就继续来撸AOP的源码
Java学习录
2019/08/19
5610
基于注解的SpringAOP源码解析(二)
Spring如何实现AOP,请不要再说cglib了!
最近工作中我都是基于注解实现AOP功能,常用的开启AOP的注解是@EnableAspectJAutoProxy,我们就从它入手。
温安适
2019/10/21
1.7K0
Spring如何实现AOP,请不要再说cglib了!
Spring源码解析(九):AOP源码之@Aspect所有相关注解解析
InstantiationModelAwarePointcutAdvisorImpl构造函数 创建具体通知
Java微观世界
2025/01/21
3260
Spring源码解析(九):AOP源码之@Aspect所有相关注解解析
Spring读源码系列之AOP--09---aop源码流程一把拿下
上一篇文章已经详细介绍了两种aop自动代理创建器的导入流程分析,此时我们已经知道了自动代理创建器注册到容器中的流程,下面我们来探究一下,自动代理创建器对具体bean创建代理的流程,这里测试环境还是用上一篇中开头给出的测试环境。
大忽悠爱学习
2022/05/10
2590
Spring读源码系列之AOP--09---aop源码流程一把拿下
SpringAop源码分析(基于注解)二:筛选通知器
我们已经知道BeanPostProcessors是在Bean实例化前后起作用的,如果看过前面的文章Spring Ioc源码分析 之 Bean的加载(八):初始化,应该知道Spring是在AbstractAutowireCapableBeanFactory#doCreateBean() 方法中有一个初始化Bean的方法:
周同学
2019/10/24
1K0
【Spring源码】讲讲Bean的生命周期
如果是普通Bean的生命周期,那么上述的回答是真正确的。确实会经历“实例化 -> 属性赋值 -> 初始化 -> 销毁”四个阶段。但是请时刻记住,Spring是个框架,框架的特性除了封装以外,还应当具备扩展性。因此,Spring Bean的生命周期除了上述常见的4个阶段外,还应该具体了解每个阶段的扩展能力,以及Spring提供的一些扩展机制。
有一只柴犬
2024/01/25
2870
【Spring源码】讲讲Bean的生命周期
推荐阅读
相关推荐
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档