浅谈 Spring AOP框架 (1)
文章目录
- 一、什么是 Spring AOP
- 二、为什么要使用 Spring AOP
- 三、AOP 的一些应用场景
- 四、AOP 的组成
- 五、如何使用 Spring AOP
- 六、Spring AOP 的实现原理
- 6.1、JDK 和 CGLIB 的区别
一、什么是 Spring AOP
AOP (Aspect Oriented Programming) :面向切面编程,它是一种思想,是对某一类事情(某一类问题)的集中处理。而 Spring AOP 是一个框架, 提供了一种对AOP思想的实现,它们的关系和 loC 与 DI 类似。
二、为什么要使用 Spring AOP
想象一个场景,我们在做后台系统时,除了登录和注册功能不需要做用户登录验证之外,几乎其他所有页面调用前端控制器(Controller)都需要先验证用户登录的状态,那这个时候我们要怎么处理呢?
之前的处理方式:每个 Controller 都要写一遍用户登录验证,但当实现的功能越来越多时,要写的登录验证也越来越多,但其实这些登陆验证的方法又是相同的,这些相同的方法就会冗余的存在项目的各个地方,导致代码修改和维护的成本很高。
这时候我们对于这种功能统一,且使用的地方较多的功能,就可以考虑使用 AOP 来统一处理。
就像之前我们使用 Spring 来写项目时,就需要额外安装 Tomcat 才能将项目在浏览器上运行起来;后来我们使用 SpringBoot 写项目,SpringBoot 已经内置好了Tomcat,我们就不需要额外安装 Tomcat 也能将项目在浏览器上运行起来。其实都是需要Tomcat来给项目的运行提供支持,但Spring是需要手动安装,而SpringBoot直接内置好了,我们开发时就比较轻松、省事。
对于 Spring AOP 来说也是一样,在没有使用Spring AOP之前,像我们写的一些管理系统,一般除了登录、注册页面能够在未登录之前访问,其他界面都是要求登陆后用户含有权限时才能访问,因此我们需要在项目里多个地方都要各自实现或调用用户验证的方法,但使用了Spring AOP之后,我们只需要在某一处配置一下,所有需要判断用户登录页面(中的方法)就全部可以实现用户登录验证了,不再需要每个方法中都写相同的用户登录验证了,给我们带来了轻松、省事。
三、AOP 的一些应用场景
(1)、统一的用户登录判断
(2)、统一日志记录
(3)、统一方法执行时间统计
可以拿到所有执行的方法的执行时间,可以很快的找到执行时间较慢的方法进行优化。
(4)、统一的返回格式设置
(5)、统一的异常处理
(6)、事务的开启和提交等
也就是说使用 AOP 可以扩充多个对象的某个能力,所以 AOP 可以说是 OOP(Object OrientedProgramming,面向对象编程)的补充和完善。
四、AOP 的组成
(1)、切面(Aspect)
切面(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义。
即切面是包含了:通知、切点和切面的类,相当于AOP 实现的某个功能的集合。
通俗的理解切面:在程序中就是一个处理某个具体问题的一个类。类里面包含了很多方法,这些方法就是切点和通知。
(2)、切点(Pointcut)
切点相当于保存了众多连接点的一个集合(如果把切点看成一个表,而连接点就是表中一条一条的数据)。
通俗的理解切点:用来配置程序进行主动拦截的规则。
其实用户在地址栏输入一个URL时,如果这个URL不是登录或注册,此时用户的请求就会被程序拦截,这个拦截不是说用户手动调用去拦截的,而是程序感知到这个请求,程序主动去拦截的,那想要程序能够具备主动拦截的能力,我们需要去配置,那么怎么配置,配置的规则是怎么样的,就是切点的工作。
(3)、通知(Advice)
切面也是有目标的——>它必须完成的工作。在 AOP 术语中,切面的工作被称之为通知。
通俗的理解通知:程序中被拦截的请求其触发的具体动作(即被拦截的请求它触发到的方法是做什么事)。就是在通知中实现具体的业务代码。通知就是切面(类)里的方法。
通知分为5类:
a.前置通知
注解是 @Before
在执行目标方法之前执行的方法叫做前置通知。
b.后置通知
注解是 @After
在执行了目标方法之后执行的方法就叫做后置通知。
c.异常通知
注解是@AfterThrowing
目标方法在执行时出现了异常时,执行的通知。
d.返回通知
注解是@AfterReturning
目标方法返回数据(return)时,执行的通知。
e.环绕通知
注解是 @Around
在目标方法执行的周期范围内(执行之前、执行中、执行后)都可以执行的方法叫做环绕通知。
(4)、连接点(Join Point)
可能会触发 AOP 规则的所有点(所有请求)。
五、如何使用 Spring AOP
(1)、添加 Spring AOP 框架的依赖

(2)、定义切面(创建切面类)

(3)、定义切点(配置拦截规则)

Aspect 支持三种通配符:
* 匹配任意字符,只匹配一个元素(包,类,或方法,方法参数)
.. 匹配任意字符,可以匹配多个元素,在表示类时,必须和*联合使用
+ 表示按照类型匹配指定类的所有类,必须跟在类名后面,如com.cad.Car+,表示继承该类的所有子类,包括本身。
切点细节解析:
切点表达式由切点函数组成,其中execution()是最常用的切点函数,用来匹配方法,语法为:
execution(<修饰符><返回类型><包.类.方法(参数)><异常>)
修饰符,一般省略:
public 公共方法
* 任意
返回类型,不能省略:
void 返回没有值
String 返回值字符串
* 任意
包:
com.gyf.crm 固定包
com.gyf.crm.*.service crm包下面子包任意(例如:com.gyf.crm.staff.service)
com.gyf.crm… crm包下面的所有子包(含自己)
com.gyf.crm.*.service… crm包下面任意子包,固定目录service,service目录任意包
类:
UserServiceImpl 指定类
*Impl 以Impl结尾
User * 以User开头
* 任意
方法名,不能省略:
addUser 固定方法
add* 以add开头
*Do 以Do结尾
* 任意
(参数):
() 无参
(int) 一个整型
(int,int) 两个
(..) 参数任意
throws,可省略,一般不写
(4)、定义通知的实现

Spring AOP项目例子链接。
六、Spring AOP 的实现原理
Spring AOP 是构建在动态代理的基础上,因此Spring 对 AOP 的支持局限于方法级别的拦截。
静态代理:编码阶段,即程序运行之前就确定的代理。
动态代理:程序运行时产生的代理。
Spring AOP 支持 JDK Proxy 和 CGLIB 方式实现动态代理。
默认情况下,实现了接口的类,使用 AOP 会基于JDK 生成代理类;没有实现接口的类,会基于 CGLIB 生成代理类。
织入:代理的生成时机
什么阶段下生成的代理对象,叫做织入。有编译器、类加载期、运行期(Spring AOP)。
6.1、JDK 和 CGLIB 的区别
(1)、JDK实现,要求被代理类必须实现接口,之后是通过 InvocationHandler 及 Proxy ,在运行时动态的在内存中生成了代理类对象,该代理对象是通过实现同样的接口实现(类似静态代理接口实现的方式),只是该代理类是在运行期时,动态的织入统一的业务逻辑字节码来完成。
(2)、 CGLIB实现,被代理类可以不实现接口,是通过继承被代理类,在运行时动态的生成代理类对象。
相关文章:
浅谈 Spring AOP框架 (1)
文章目录 一、什么是 Spring AOP二、为什么要使用 Spring AOP三、AOP 的一些应用场景四、AOP 的组成五、如何使用 Spring AOP六、Spring AOP 的实现原理6.1、JDK 和 CGLIB 的区别 一、什么是 Spring AOP AOP (Aspect Oriented Programming) :面向切面编程ÿ…...
Linux 面试准备 - 2024
复习一下,资料来自慕课网课程 Linux 速成班和一些网上面试资料。 1. Linux 内核功能 1. 内存管理 2. 进程管理 3. 设备驱动程序 4. 系统调用和安全防护 2. 文件系统 - 一切皆文件 2.1 文件目录 /根目录etc配置文件bin必要命令usr 二级目录(非用户…...
C++笔记---类和对象(中)
1. 类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。 一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,分别为:构造函数,析构函数,拷贝构…...
【C++】入门基础知识
河流之所以能够到达目的地,是因为它懂得怎样避开障碍。💓💓💓 目录 ✨说在前面 🍋知识点一:C的发展历史 • 🌰1.C发展历史 • 🌰2.C的迭代与更新 • 🌰3.编程语言排…...
AI的应用场景和未来展望
AI(人工智能)的应用场景广泛且多样,已经深入到我们生活的方方面面,成为现代社会不可或缺的一部分。 AI的应用场景 1、通用软件与工具型应用 办公软件:如钉钉、飞书等,通过AI技术提供内容生成与摘要、智能…...
vim、sublime、notepad文本编辑器的使用
VIM: Windows上配置gvim并作为C和C的IDE Windows上配置gvim并作为C和C的IDE | Reasuon sublime notepad...
PyCharm中的外部更改识别:终极解决方案指南
标题:PyCharm中的外部更改识别:终极解决方案指南 引言 PyCharm,作为JetBrains公司开发的集成开发环境(IDE),以其强大的功能和高效的代码编辑体验而广受开发者喜爱。然而,在开发过程中…...
Qt——QTCreater ui界面如何统一设置字体
第一步:来到 ui 设计界面,鼠标右键点击 改变样式表 第二步:选择添加字体 第三步:选择字体样式和大小,点击 ok 第四步:点击ok或apply,完成设置...
Linux驱动入门实验班day03-GPIO子系统概述
3.通用框架1——最简单方式1:执行命令cat /sys/kernel/debug/gpio查看串口信息 gpio4对应的下列 方式2: 对于按键GPIO4_14:对应第四组第14个引脚 gpiochip3 ,从96开始, 9614110;...
240803-沉侵式翻译插件配置Ollama的API实现网页及PDF文档的翻译
1. 在插件中点击Options按钮 2. 在开发者模式中启动Enable Beta Testing Features 3 在General中进行设置 ## 4. 在Expand中设置API的URL 5. Qwen:0.5B网页翻译效果 6. Qwen:0.5BPDF翻译效果 7. 参考文献 gemma - 给沉浸式翻译插件配置本地大模型o…...
HTML-08.表单标签
一.表单标签 场景:在网页中主要负责数据采集功能,如注册、登录等数据采集 标签:<form> 表单项:不同类型的input元素、下拉列表、文本域等 <input>:定义表单项。通过type属性控制输入形式 <select>:定义下拉列表…...
SAP ABAP se16n 双击跳转实现
参考老白 SAP小技巧 改造SE16N(九 双击跳转及字段描述优化) (qq.com) se16n 双击跳转实现 我的实现 se38 lse16nlcl 287行 call method cl_gui_control>set_focusexporting control alv_grid. *.....at the moment do detail view on double clickCALL METHOD cl_gu…...
Linux shell编程学习笔记68: curl 命令行网络数据传输工具 选项数量雷人(上)
0 前言 在网络时代,有经常需要在网络上传输数据,时我们需要通过网络下载文件,为了满足这种时代需要,Linux提供了众多网络命令,我们今天先研究curl命令。例如,我们可以使用 curl 从 URL 下载文件࿰…...
马尔科夫决策过程
马尔科夫决策过程 贝尔曼方程 贝尔曼方程(Bellman Equation)是动态规划中的一个核心概念,用于解决最优决策问题。贝尔曼方程通过递归的方式,将问题分解为子问题,从而使得最优策略的求解变得可行。贝尔曼方程广泛应用…...
未知攻焉知防:从攻击者视角看网络安全的“攻守之道”
自首届网络安全攻防实战演练开展以来,这一活动已成为网络安全领域备受关注的大事件。今年,攻防实战演练更上升到了一个全新高度,包括行动任务数量、演练周期时长、攻击强度以及演练类别等,较以往都有极大提升,堪称“史…...
数字孪生赋能智慧城市大脑智建设方案(可编辑65页PPT)
引言:随着科技的飞速发展,智慧城市的建设已成为全球城市发展的新趋势。数字孪生技术作为其中的关键技术之一,正逐步赋能智慧城市大脑的建设,推动城市治理从数字化向智能化、智慧化转型升级。本方案旨在简要介绍数字孪生赋能智慧城…...
c++----内存管理
okk,大家好。我们大家学习了鄙人的前面前面几篇博客,并且还稍微使用了一些c的基础知识。并且我们前面都说过,我们前面学习的知识都说过。我们前面的几篇博客都是我们以后使用c基础。但是我们大家都知道现在代码都关注什么时间啊,内…...
C++——哈希结构
1.unordered系列关联式容器 本节主要介绍unordered_map和unordered_set两个容器,底层使用哈希实现的 unordered_map 1.unordered_map是储存<key,value>键值对的关联式容器,其允许通过key快速查找到对应的value,和map非常相似&#x…...
智能小程序 Ray 开发面板 SDK —— 无线开关一键执行模板教程(一)
1. 准备工作 前提条件 已阅读 Ray 新手村任务,了解 Ray 框架的基础知识已阅读 使用 Ray 开发万能面板,了解 Ray 面板开发的基础知识 构建内容 在此 Codelab 中,您将利用面板小程序开发构建出一个支持一键执行及自动化的无线开关面板&…...
rockDB(1)
文章目录 概述编译rocksdb压缩库 基本接口 小结 概述 RocksDB 是 Facebook 的一个实验项目,目的是希望能开发一套能在服务器压力下,真正发挥高 速存储硬件性能的高效数据库系统。这是一个C库,允许存储任意长度二进制 KV 数据。支持原 子读写…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
