浅谈 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 数据。支持原 子读写…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
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…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
