第二十四章 Spring之源码阅读——AOP篇

Spring源码阅读目录

第一部分——IOC篇

第一章 Spring之最熟悉的陌生人——IOC
第二章 Spring之假如让你来写IOC容器——加载资源篇
第三章 Spring之假如让你来写IOC容器——解析配置文件篇
第四章 Spring之假如让你来写IOC容器——XML配置文件篇
第五章 Spring之假如让你来写IOC容器——BeanFactory和FactoryBean
第六章 Spring之假如让你来写IOC容器——Scope和属性填充
第七章 Spring之假如让你来写IOC容器——属性填充特别篇:SpEL表达式
第八章 Spring之假如让你来写IOC容器——拓展篇
第九章 Spring之源码阅读——环境搭建篇
第十章 Spring之源码阅读——IOC篇

第二部分——AOP篇

第十一章 Spring之不太熟的熟人——AOP
第十二章 Spring之不得不了解的内容——概念篇
第十三章 Spring之假如让你来写AOP——AOP联盟篇
第十四章 Spring之假如让你来写AOP——雏形篇
第十五章 Spring之假如让你来写AOP——Joinpoint(连接点)篇
第十六章 Spring之假如让你来写AOP——Pointcut(切点)篇
第十七章 Spring之假如让你来写AOP——Advice(通知)上篇
第十八章 Spring之假如让你来写AOP——Advice(通知)下篇
第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计
第二十章 Spring之假如让你来写AOP——Aspect(切面)篇
第二十一章 Spring之假如让你来写AOP——Weaver(织入器)篇
第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇
第二十三章 Spring之假如让你来写AOP——融入IOC容器篇
第二十四章 Spring之源码阅读——AOP篇


文章目录

  • Spring源码阅读目录
    • 第一部分——IOC篇
    • 第二部分——AOP篇
  • 前言
  • Joinpoint(连接点)
  • Pointcut(切点)
  • Advice(通知)
  • Aspect(切面)
  • Weaver(织入器)
  • Target Object(目标对象)
  • 融入IOC容器
  • 总结


前言

    对于Spring一直都是既熟悉又陌生,说对它熟悉吧,平时用用没啥问题,但面试的时候被问的一脸懵逼,就很尴尬,都不好意思在简历上写着熟悉Spring了
在这里插入图片描述

    所以决定花点时间研究研究Spring的源码。主要参考的书籍是:《Spring源码深度解析(第2版)》、《Spring揭秘》、《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》


    前边 A君AOP 集成到了 IOC容器 中,Spring 中最基础,也是最重要的两部分内容都整完了。不知道对大家是否有所帮助?不过,这 AOP 部分,A君 换了个写法,之前在写 IOC 篇章的时候,A君 站在完全站在开发者的角度上,去考虑抽象、拓展。而 AOP 篇章,基本上是以 Spring 的视角开展的,一来是怕自己理解有所偏差,胡说八道,误人子弟就不好了,二来也是希望对 AOP 部分有更深入的理解。但这也造成一个问题,这篇文章是否有存在的必要。按理说,能读懂前面 AOP 相关章节,再去看 Spring ,应该是无压力的,这篇文章就没有任何意义了。思来想去,A君 还是决定写下这篇文章,权当折腾这么久的劳动成果吧,也算是对 AOP 进行一个总结

    在研究 AOP 的过程中,A君 曾多次被 Spring 的设计、代码惊艳到了,Spring 能出圈,受到大家的追捧不是没有原因的。好了,废话不多说了,开始我们的源码之旅吧,具体实现、细节部分前面相关章节已经说过,这篇就不重复水字数了,这里让我们把重点放在 UML 图上,了解下 Spring 的设计。

Joinpoint(连接点)

    让我们回到梦开始的地方,从 Joinpoint(连接点) 入手把,其 类图 如下:

在这里插入图片描述

关于 AOP 部分,Spring 也遵循 AOP联盟 规范,大体上,都是在其的基础上做拓展。Joinpoint(连接点) 一如既往的简单,比起一堆抽象类,实现类。Joinpoint(连接点) 简直就是梦中情类,出淤泥而不染。就一个实现类,当然,也有些内部类,这里不在讨论之列。之所以这么简单,主要 Joinpoint(连接点) 也确实没有啥,主要用于保存目标对象、目标方法、已经方法参数,还有个就是负责整个调用链的执行,其他就没它什么事了。啥?你说增强方法有可能用到。不,也用不到,那个用的是 AspectJ 的,一直都是 AspectJ 默默的抗下了所有。这里的 Joinpoint 接口,主要用于 Spring 内部使用

在这里插入图片描述

Pointcut(切点)

    紧接着出场的是 Pointcut(切点),它的 类图 如下:

在这里插入图片描述

哇,看这种就头疼,是不是瞬即觉得 Joinpoint(连接点) 眉清目秀了起来。其实,其他用的并不多, 自从有了 AspectJ 后,Spring 也开始‘摆烂’了,全面拥抱 AspectJ,其他实现应该都是之前没有 AspectJ 时候过的苦日子。现在重点关注 ExpressionPointcut 这条线就行了,只有一条线,Pointcut(切点) 也开始眉清目秀起来了

Advice(通知)

    接下来,有请下一位选手 Advice(通知)类图 如下:

在这里插入图片描述

Advice(通知) 这位选手更加不友好了,都快成蜘蛛网了。至于为什么会这样,已经在 第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计 中详细讨论过了。这里就简单的说下吧,其实把 Advice(通知) 分为两个阶段来理解就简单了,这两个阶段分别是:有 AspectJ 前,有 AspectJ 后。首先是第一阶段,那时候没有 AspectJ,早期的 AOP 就比较简单,由 Spring 提供对应的增强接口,用户去实现,再由 Spring 进行对应的转换

通知接口
用户实现
Spring转换

早期就分为两部分,一部分以 Advice 为核心的通知接口,另一部分以 MethodInterceptor 为核心的转换实现,大体如下:

在这里插入图片描述

后面有了 AspectJ 后,事情开始变得复杂起来了,首先 AspectJ 提供了很多强大的功能,意味着有更多的通知可以实现,一方面还得给 AspectJ 提供公共实现,还得对老接口的兼容,都统一用 AspectJ 实现。大体如下:

在这里插入图片描述

Aspect(切面)

    告别了上一位令人头疼的 Advice(通知),我们引来新的选手——Aspect(切面),这次还是个双子星。我们先来看下 Advisor类图 如下:

在这里插入图片描述

这个就是典型的 Spring 设计了,基本上和 Pointcut 对应,因为它就是用来管理 Advice(通知)Pointcut(切点)

接着是 Advised类图 如下:

在这里插入图片描述

Advised 也很明了,没啥好说的,它主要是用以管理 Advisor

Weaver(织入器)

    好的,有请下一位选手——Weaver(织入器)类图 如下:

在这里插入图片描述

Weaver(织入器) 的功能就是创建代理对象,并且把切面织入到代理中去。目前就两种实现:接口代理、类代理。那简单也是可以理解的

Target Object(目标对象)

    接着是 AOP 最后一个选手——Target Object(目标对象)类图 如下:

在这里插入图片描述

这部分内容并不是 AOP联盟 的规定,是 Spring 自己的实现。看它的实现也能明白,是为了支持不同的作用域设计的

融入IOC容器

    还有一个特别嘉宾——AspectJAwareAdvisorAutoProxyCreator类图 如下:

在这里插入图片描述
AspectJAwareAdvisorAutoProxyCreator 主要的作用就是把 AOP组件 融入到 IOC 中,用户只要配置就行了,不需要关心具体实现,这也是方面用户使用


总结

    之前一直想对 Spring 进行研究,一直不得空,现在总算把 AOP 部分过了一遍,所幸结果还是让人欣喜地

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题&移动语义

每日一题 无重复字符的最长子串 class Solution { public:int lengthOfLongestSubstring(string s) {/*利用set的特性,set中不能有重复的元素,所以可以用set来判断是否有重复的元素然后用两个指针i和j来表示子串的左右边界,然后用ans来记录…

量化加速知识点(整理中。。。)

量化的基本概念 通过减少模型中计算精度,从而减少模型计算所需要的访存量。 参考

C++语言之STL

STL STL是标准模板库,是惠普实验室开发的一系列软件的统称 STL的6大组件 容器 算法 迭代器 仿函数 适配器 空间适配器 容器 作用:容纳存储的数据 分类: 序列式容器: 强调值的顺序,每个元素均有固定的位置,除非用删除或插入的操作改变这个位置,如vector,deque/queue,list; 关联式…

嵌入式实验报告:家用计时器

实验目的和要求 1、实验目的 掌握STM32串口通信原理。学习编程实现STM32的UART通信掌握STM32中断程序设计流程。熟悉STM32固件库的基本使用。熟悉STM32定时器中断设计流程。2、实验要求 设计一个家用计时器,其功能如下: 利用串口设置计时时间,格式:XX:XX:X 例如01:59:…

阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答: 初级 Java 开发面临的最大瓶颈在于,脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug,久而久之就会发现,自己的技术水平跟刚工作时相比没什么进步。 所以我们…

理解 Python 中的 self 它的作用与在类中的应用

理解 Python 中的 self: 它的作用与在类中的应用 在 Python 中,self 是一个约定俗成的关键字,用于指代类的当前实例。它是实例方法中的第一个参数,通过 self 可以访问类的属性和其他方法。虽然这个词不是 Python 语法的强制部分,…

低成本搭建单相220V转三相380V变频器配滤波器的转换器

一、单相转三相的迫切需求 在许多工业和商业场景中,三相电源因其高效、稳定的特性而被广泛应用。然而,并非所有场所都能提供三相电源,尤其是在一些老旧建筑或偏远地区,单相220V电源更为常见。这就迫切需要我们找到一种有效的转换…

多线程并发造成的数据重复问题解决方案参考(笔记记录)

一、添加 MySQL 组合唯一索引,需要注意什么坑? 在 MySQL 中,创建组合唯一索引(Composite Unique Index)时,需要注意以下一些容易踩的坑: 1. 字段顺序影响索引使用 问题:组合唯一索…

如何从 VMware 官网下载最新版本的 VMware Workstation

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 下载VMware 📒📝 操作步骤🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾尝试从 VMware 官网下载 VMware Workstation,但总是被繁杂的选择和复杂的操作困扰?VMware 提供的产品种类繁多,而且官网页面设计复…

【人工智能】深度学习入门:用TensorFlow实现多层感知器(MLP)模型

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 多层感知器(MLP)是一种基础的神经网络结构,广泛应用于分类和回归任务。作为深度学习的重要组成部分,理解并实现MLP是学习更复杂神经网络模型的基础。本文将介绍多层感知器的核心概念、数学原理,并使用…

C#无符号整数类型详解:声明、使用及注意事项

在C#编程语言中,无符号整数类型(Unsigned Integer Types)指的是那些只能表示非负整数的数据类型。与有符号整数类型(Signed Integer Types)不同,无符号整数类型不包括负数,因此它们可以表示的正…

Vue3中的TSX

在 Vue 3 中,有两种声明组件的方式 常用的Template方式TSX (TypeScript JSX) ,tsx是一种声明组件的灵活方式,特别适合在动态渲染和复杂逻辑场景中。 一、TSX 的特点 TSX 是 JSX 的扩展,允许使用 TypeScript 的强类型特性。更适…

SQLite Truncate Table

SQLite Truncate Table SQLite 是一种轻量级的数据库管理系统,广泛用于各种应用程序中。在数据库管理中,有时候需要快速删除表中的所有数据,这时就可以使用 TRUNCATE TABLE 命令。然而,SQLite 与其他数据库管理系统(如…

数据结构_图的遍历

深度优先搜索遍历 遍历思想 邻接矩阵上的遍历算法 void Map::DFSTraverse() {int i, v;for (i 0; i < MaxLen; i){visited[i] false;}for (i 0; i < Vexnum; i){// 如果顶点未访问&#xff0c;则进行深度优先搜索if (visited[i] false){DFS(i);}}cout << endl…

Spring Boot核心概念:日志管理

日志记录是软件开发的重要组成部分&#xff0c;它帮助开发人员了解应用程序运行时的状态&#xff0c;以及在故障排查和性能监控时提供关键信息。Spring Boot通过提供默认的日志配置&#xff0c;简化了日志管理。 Spring Boot默认日志框架 Spring Boot默认使用Logback作为日志…

基于CVE安全公告号,全面修复麒麟ARM系统OpenSSH漏洞

前言&#xff1a;负责的其中一个从0开始搭建的某生产项目上线前需要做青藤安全扫描&#xff0c;过了后才允许上线&#xff0c;该项目从操作系统、中间件、数据库、容器等全国产信创化&#xff0c;公司公告为CVE安全公告号&#xff0c;而修复漏洞的责任归我&#xff0c;需要根据…

python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析

目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …

vulnhub靶场-tomato

arp-scan -l用arp-scan探测一下网段内目标靶机的IP arp-scan 是一款轻量级的arp扫描工具&#xff0c;会解析mac地址&#xff0c;就是想 局域网 中所有可能的ip地址发出arp请求包&#xff0c;如果得到arp回应&#xff0c;就证明了局域网中某主机使用了该ip。 nmap扫一下c段 nma…

JavaScript中的执行顺序

分析下面JavaScript代码的执行顺序&#xff1a; <script>setTimeout(() > console.log(代码开始执行), 0)new Promise((resolve, reject) > {console.log(开始for循环);for (let i 0; i < 10000; i) {i 99 && resolve()}}).then(() > console.log(…

【天壤智能-注册安全分析报告-无验证纯IP限制存在误拦截隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…