当前位置: 首页 > news >正文

第二十四章 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 部分过了一遍,所幸结果还是让人欣喜地

在这里插入图片描述

相关文章:

第二十四章 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,文章内容(代码&#xff0c…...

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…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...