第二十四章 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 进行对应的转换
早期就分为两部分,一部分以 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 部分过了一遍,所幸结果还是让人欣喜地

相关文章:
第二十四章 Spring之源码阅读——AOP篇
Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...
Linux配置MySQL自动备份
Linux配置MySQL自动备份 配置MySQL的自动备份首先要编辑一个备份脚本然后配置开启Linux定时任务即可,下面是具体配置 1、配置备份脚本并测试执行 1.1 编写备份脚本 #这里创建脚本名为mysql_backups.sh mkdir ~/mysqlmulu touch ~/mysqlmulu/mysql_backups.sh#!/…...
qt 之 QDockWidget设置不可拖动
在Qt中,可以通过设置QDockWidget的属性来禁止它被拖动。你可以使用QDockWidget::setFeatures方法并传递QDockWidget::DockWidgetMovable作为参数来禁用拖动功能。 以下是一个简单的示例代码,展示了如何设置QDockWidget为不可拖动: #include …...
【Java知识】Java性能测试工具JMeter
一文带你了解什么是JMeter 概述JMeter的主要功能:JMeter的工作原理:JMeter的应用场景:JMeter的组件介绍: 实践说明JMeter实践基本步骤:JMeter实践关键点: JMeter支持哪些参数化技术?常见插件及其…...
Git 安装
一、下载安装包 Git官网 https://git-scm.com/ Git 阿里镜像 二、安装 点击安装包运行,基本上一路 next 就行。 使用许可声明 选择安装目录 选择组件,默认勾选就行 选择开始菜单文件夹,默认就行 选择 Git 的默认编译器,默认 V…...
【Python】FastAPI:Token认证
FastAPI:Token认证 本教程通过 FastAPI 实现用户登录和基于 JWT(JSON Web Token) 的认证与授权,适合初学者到进阶用户。教程特别关注 Depends、OAuth2PasswordBearer 等非基础操作的详细讲解,帮助你全面掌握相关技术。…...
【FAQ】HarmonyOS SDK 闭源开放能力 —ArkUI
1.问题描述: App启动的时候会有个弹框,询问用户是否需要进去隐私模式,在该隐私模式下,App不能获取任何用户信息。当前鸿蒙App级别是否有隐私模式? 解决方案: 当前实现隐私模式都是三方应用自己实现&…...
ubuntu没有了有线网络如何修复
今天打开ubuntu之后发现有线网络连接没有了,如下图,此时是修复好之后的,“有线”部分存在,出现问题时是不存在的 此时只需要修改NetworkManager.conf配置文件,将managedfalse更改为managedtrue,保存退出就可以了 sudo…...
渗透学习之windows基础
引路Windows基础之病毒编写(完结)_哔哩哔哩_bilibili windows基础(2) 21 ftp 23 tenlet 80 web 80-89 可能是web 443 ssl心脏滴血漏洞以及一些web漏洞测试 445 smb 1433 msspl 1521 oracle 2082/2083 cpanel 主机管理系…...
【Swift】运算符
文章目录 术语赋值运算符算数运算符基本四则算术运算符求余运算符一元负号运算符一元正号运算符 比较运算符三元运算符空合运算符区间运算符闭区间运算符半开区间运算符单侧区间运算符 逻辑运算符逻辑非运算符逻辑与运算符逻辑或运算符逻辑运算符组合计算 位运算符运算符优先级…...
minikube start --driver=docker 指定国内镜像
要在Ubuntu 22上使用Minikube并指定国内镜像,你可以根据以下步骤操作: 安装Minikube: 你可以通过阿里云提供的国内源来安装Minikube,这样可以避免访问国外源的问题。使用以下命令安装Minikube: curl -Lo minikube http…...
Quality minus junk论文阅读
Quality minus junk论文阅读 文章目录 Quality minus junk论文阅读 AbstractTheoretical FrameworkEmpirical AnalysisDataQuality scorePortfoliosEx ante quality forecasts fundamentals Results and DiscussionThe price of qualityUnderstanding the price of quality: th…...
Apache和HTTPS证书的生成与安装
摘要 介绍linux系统下使用openssl生成https证书,并将证书安装在apache服务器上,最终实现通过https访问服务器。这个过程涉及到openssl生成自签名证书(适用于测试环境),修改apache配置,开放防火墙https端口…...
前端—Cursor编辑器
在当今快速发展的软件开发领域,效率和质量是衡量一个工具是否优秀的两个关键指标。今天,我要向大家推荐一款革命性的代码编辑器——Cursor,它集成了强大的AI功能,旨在提高开发者的编程效率。以下是Cursor编辑器的详细介绍和推荐理…...
【数据结构】【线性表】【练习】删除链表倒数第n个结点
目录 申明 题目 分析题目信息 解题思路 代码解析 技巧解析:创建虚拟头结点 时间复杂度分析 思考:能否只用一趟扫描实现? 双指针 双指针解题思路 代码解析 申明 该题源自力扣题库19,文章内容(代码,…...
MySQL高级(四):索引
基础概念 什么是索引? 索引是一种数据结构,用于加速查询的过程。它类似于书本的目录,可以快速定位数据行。MySQL 索引主要是基于 B 树(也有其他类型如哈希索引、全文索引等)来实现的。 为什么使用索引? …...
hhdb数据库介绍(9-21)
计算节点参数说明 checkClusterBeforeDnSwitch 参数说明: PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时,是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…...
React中组件通信的几种方式
在构建复杂的React应用时,组件之间的通信是至关重要的。从简单的父子组件通信到跨组件状态同步,不同组件之间的通信方式多种多样。 1. 父子组件通信 父子组件通信是 React 中最基本的通信方式之一。在这种模式下,数据是从父组件通过 props …...
python脚本实现csv中百度经纬度转84经纬度
数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84...
syslog udp配置笔记
要将 /var/log/ 目录下的日志信息通过 UDP 发送到远程服务器,可以使用 rsyslog 的配置来实现。以下是详细步骤: 步骤 1:确保 rsyslog 已安装 如果 rsyslog 没有安装,请使用以下命令进行安装: 在 CentOS/RHEL: sudo yum install rsyslog在 Ubuntu/Debian: sudo apt-get i…...
AI意识与认知操控:技术伦理、风险与治理框架
1. 项目概述:当“意识”成为可编程对象最近几年,我身边不少从事AI研发的朋友,聊天时的话题已经从“模型精度又提升了几个点”逐渐转向了一些更“虚”但更根本的问题。比如,我们训练的大语言模型,在和我们进行几轮深度对…...
芯片设计人才培养:从Sondrel模式看产学合作如何弥合能力鸿沟
1. 项目背景与行业契机最近在整理行业资料时,翻到一篇十多年前的旧闻,讲的是英国一家名为Sondrel的系统级芯片设计咨询公司,与宁波诺丁汉大学合作,启动了一个针对中国学生的芯片设计人才培养项目。这件事发生在2013年,…...
LangGraph 持久化深度解析:Checkpoint 机制如何实现对话记忆和断点续跑
很多同学在第一次接入 LangGraph 时,会发现图默认是「无状态」的——每次 invoke,上一轮的消息就消失了。你以为加了 MessagesState 就有记忆了,结果测试一问,Agent 完全不知道「你叫什么名字」。 更惨的是什么?生产环…...
网站国产化改造怎么做?深度解读国产化替代路径与CMS推荐
在近年来科技领域的舆论场中,“国产化”无疑是出现频率最高的关键词之一。从芯片到操作系统,从数据库到办公软件,再到企业对外展示的门户——网站,国产化替代已从“可选项”变成了很多行业的“必答题”。但国产化仅仅是“换个牌子…...
北京AGG聚砂吸声板哪家性价比高
在选择AGG聚砂吸声板时,“性价比”往往不只是看价格,而是综合考量声学性能、施工服务、材料稳定性和后期维护的平衡。北京市场上的供应商不少,但真正能长期稳定输出成熟产品的,需要从几个实际角度去判断。首先,要优先看…...
拾亩绿光纯亚麻籽微粉效果怎么样
很多人想通过亚麻籽补充营养,却常遇到传统亚麻籽难吸收、营养易流失的问题:直接嚼咽口感粗糙,普通研磨粉冲调结块,榨油后Omega-3等核心营养大量损耗。拾亩绿光纯亚麻籽微粉依托南京国英健康科技有限公司的专利技术,可解…...
2026年AI大模型接口加速站亲测:六家平台横评,诗云API(ShiyunApi)成最优之选
在进行AI开发时,一个现实问题摆在眼前:如何接入模型厂商的官方API?对于海外开发者而言,注册、绑卡、调用这三步便能轻松解决。然而,国内开发者却面临着诸多难题,如跨境网络波动、外币支付门槛、发票合规需求…...
EmbBERT架构解析:面向TinyML的革新设计与优化
1. EmbBERT架构解析:面向TinyML的革新设计在边缘计算设备上部署自然语言处理模型一直面临内存和计算资源的双重限制。传统BERT模型即使经过压缩,其2MB版本在TinyNLP基准测试中平均准确率仅为83.93%,且激活内存占用高达1.5MB。EmbBERT通过三大…...
基于EVE ESI API与AI Agent的自动化游戏监控与数据分析实践
1. 项目概述:为AI助手注入EVE宇宙的灵魂 如果你是一名《EVE Online》的玩家,同时又对AI自动化工具感兴趣,那么你很可能和我一样,长期被一个矛盾所困扰:一方面,EVE这个沙盒宇宙充满了需要监控和管理的日常事…...
混元图像3.0:多模态联合表征驱动的视觉逻辑引擎
1. 项目概述:这不是又一个“图生图”玩具,而是一次底层能力的重新定义“混元:发布图像3.0图生图模型,总参数量80亿”——这个标题里藏着三个被多数人忽略的关键信号:“图像3.0”不是版本号,是代际跃迁的命名…...
