浅谈 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 数据。支持原 子读写…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
