死磕Spring之AOP篇 - Spring AOP总览
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读。
Spring 版本:5.1.14.RELEASE
在开始阅读 Spring AOP 源码之前,需要对 Spring IoC 有一定的了解,可查看我的 《死磕Spring之IoC篇 - 文章导读》 这一系列文章
了解 AOP 相关术语,可先查看 《Spring AOP 常见面试题) 》 这篇文章
该系列其他文章请查看:《死磕 Spring 之 AOP 篇 - 文章导读》
通过上一篇 《初识 JDK、CGLIB 两种动态代理》 文章我们对 Spring AOP 底层的 JDK 动态代理和 CGLIB 动态代理有了一定的了解,也知道如何简单地使用两种动态代理创建代理对象。相信上篇文章可以让你对 Spring AOP 有了一个初步的认识,那么接下来我们准备进入 Spring AOP 源码学习阶段。
在开始 Spring AOP 源码学习前,本文会对 Spring AOP 涉及到的大部分主要的 API 进行介绍,让我们对 Spring AOP 有一个全面的认识,这样在学习 Spring AOP 源码的过程中有一个清晰的思路会更加易于理解,然后在后续的文章从 Spring AOP 的自动代理开始深入学习,直接进入正题吧。
Spring AOP API 总览
如下图所示:

上面这张图片列出了 Spring AOP 涉及到的大部分 API,接下来我们依次简单介绍一下:
Joinpoint:连接点,也就是我们需要执行的目标方法
Pointcut:切点,提供 ClassFilter 类过滤器和 MethodMatcher 方法匹配器支持对类和方法进行筛选。
Advice:通知器,一般都是 MethodInterceptor 方法拦截器,不是的话会通过 AdvisorAdapter 适配器转换成对应的 MethodInterceptor 方法拦截器。
Advisor:Advice 容器接口,与 Advice 是一对一的关系;它的子接口 PointcutAdvisor 相当于一种 Pointcut 和 Advice 的容器,将 Pointcut 过滤 Joinpoint 的能力和 Advice 进行整合,这样一来就将两者关联起来了。
Advisor 适配器:AdvisorAdapter 是 Advisor 的适配器,当筛选出能够应用于方法的所有 Advisor 后,需要获取对应的 Advice;
- 如果不是 MethodInterceptor 类型,则需要通过 AdvisorAdapter 适配器转换成对应的 MethodInterceptor 方法拦截器。
AOP 代理对象:AOP 代理对象,由 JDK 动态代理或者 CGLIB 动态代理创建的代理对象;
- 选择哪种动态代理是通过 AopProxyFactory 代理工厂根据目标类来决定的。
AOP 代理配置:AdvisedSupport 配置管理器中保存了对应代理对象的配置信息,例如满足条件的 Advisor 对象、TargetSource 目标类来源;
- 在创建代理对象的过程,AdvisedSupport 扮演着一个非常重要的角色。
AOP 代理对象创建:AOP 代理对象的创建分为手动模式和自动模式;不管哪种模式都和 AdvisedSupport 配置管理器有关;
- 手动模式就是通过 Spring AOP 提供的 API 进行创建;
- 自动模式则是和 Spring IoC 进行整合,在 Bean 的加载过程中如果需要进行代理,则创建对应的代理对象;
AdvisorChainFactory:Advisor 链路工厂
- AdvisedSupport 配置管理器中保存了代理对象的所有 Advisor 对象,当拦截某个方法时,需要通过 AdvisorChainFactory 筛选出能够应用于该方法的 Advisor 们;
- 另外还需要借助 AdvisorAdapter 适配器获取 Advisor 对应的 MethodInterceptor 方法拦截器,将这些 MethodInterceptor 有序地形成一条链路并返回。
IntroductionInfo:引介接口,支持代理对象实现目标类没有真正实现的额外的接口;
- 在 Advisor 的子接口 IntroductionAdvisor 中会继承这个 IntroductionInfo 接口,通过 @DeclareParents 注解定义的字段会被解析成 IntroductionAdvisor 对象。
AOP 代理目标对象来源:目标类来源,和代理对象进行关联,用于获取被代理代理的目标对象;
- 在代理对象中最终的方法执行都需要先通过 TargetSource 获取对应的目标对象,然后执行目标方法。
Joinpoint
类图

ConstructorInvocation,是基于构造器的一个调用器,在 Spring AOP 中仅支持方法级别的代理,所以这个接口并没有被使用
ReflectiveMethodInvocation,Joinpoint 的底层实现类,一个基于反射的方法调用器,本文不进行分析,在后续的文章进行讲解
死磕Spring之AOP篇 - Spring AOP总览的更多相关文章
- 白话Spring(基础篇)---AOP(execution表达式)
作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! -------------------------------- ...
- 白话Spring(基础篇)---AOP(execution表达式)(转)
[一知半解,就是给自己挖坑] 作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! ----------------- ...
- Spring第12篇—— Spring对Hibernate的SessionFactory的集成功能
由于Spring和Hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心 ...
- 死磕Spring之AOP篇 - Spring AOP常见面试题
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 死磕Spring之AOP篇 - Spring AOP自动代理(一)入口
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 死磕Spring之AOP篇 - Spring AOP自动代理(二)筛选合适的通知器
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 死磕Spring之AOP篇 - Spring AOP自动代理(三)创建代理对象
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 死磕Spring之AOP篇 - Spring AOP注解驱动与XML配置
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
随机推荐
- NGK公链助力医疗行业数据安全
近年来医疗领域的数据泄露事件时有发生,医疗行业数据面临着医疗数据获得不易及缺乏有效管理和数据安全机制问题.而区块链的去中心化.分布式账本等特点正好契合医疗领域的需求点. 医疗数据市场痛点 一.医疗信息 ...
- 通过setMouseTracking实现用鼠标拖动控件
1 import sys 2 from PyQt5.Qt import * 3 4 class Mwindow(QWidget): 5 leftclick = False 6 7 def __init ...
- 百度webuploader_c#实现文件分片上传思路
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java基础语法:abstract修饰符
一.简介 描述: 'abstract'修饰符可以用来修饰方法,也可以修饰类. 如果修饰方法,那么该方法就是抽象方法:如果修饰类,那么该类就是抽象类. 抽象类和抽象方法起到一个框架作用,方便后期扩展的重 ...
- CNN结构演变总结(一)经典模型
导言: 自2012年AlexNet在ImageNet比赛上获得冠军,卷积神经网络逐渐取代传统算法成为了处理计算机视觉任务的核心. 在这几年,研究人员从提升特征提取能力,改进回传梯度更新效果 ...
- RabbitMQ(三) SpringBoot2.x 集成 RabbitMQ
3-1 RabbitMQ 整合 SpringBoot2.x 生产者发送消息 创建 SpringBoot 项目application.properties 配置 spring.rabbitmq.host ...
- 后端程序员之路 30、webapi测试工具的一点想法
有了webapi,对应的,也就要有各种语言的sdk,有时候,还要有一个好用的api测试工具.sdk和api测试工具在功能上有一些异同,有时候测试工具会直接基于sdk来制作. 它们通常包含: 1.htt ...
- 研究了一下 Webpack 打包原理,顺手挣了个 AirPods Pro
这些年,Webpack 基本成了前端项目打包构建的标配.关于它的原理和用法的文章在网上汗牛充栋,大家或多或少都看过一些.我也一样,大概了解过它的构建过程以及常用 loader 和 plugin 的配置 ...
- 树莓派4B安装官方Ubuntu20 Server版(64位)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- createNewFile() 报错 open failed: ENOENT (No such file or directory) 的解决方案
在写Android应用中使用createNewFile() 遇到open failed: ENOENT (No such file or directory) 错误,在网上查了许多方法,不过都不能解决 ...
- 白话Spring(基础篇)---AOP(execution表达式)