浅谈 Spring AOP框架 (1)

news2025/2/24 23:10:20

文章目录

  • 一、什么是 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实现,被代理类可以不实现接口,是通过继承被代理类,在运行时动态的生成代理类对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1979174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[CTF]-PWN:格式化字符串漏洞题综合解析

printf型格式化字符串漏洞&#xff1a; 任意地址写&#xff1a; 32位&#xff1a; 例题&#xff08;inndy_echo&#xff09;&#xff1a; 有格式化字符串漏洞&#xff0c;可以修改printf的got表内地址为system&#xff0c;传参getshell 解法一&#xff1a; 在32位中可以使…

C语言 操作符

操作符分多种&#xff1a;算术操作符&#xff0c;移位操作符&#xff0c;位操作符&#xff0c;赋值操作符&#xff0c;单目操作符&#xff0c;关系操作符&#xff0c;逻辑操作符&#xff0c;条件操作符&#xff0c;逗号表达式&#xff0c;下标引用&#xff0c;函数调用和结构成…

【Web开发手礼】探索Web开发的秘密(十四)-Vue2(1)Node.js的安装、Vue入门

主要介绍了Node.js的安装教程、Vue2常用的一些指令、声明周期&#xff01;&#xff01;&#xff01; 文章目录 前言 Node.js安装 选择安装目录 验证NodeJS环境变量 配置npm的全局安装路径 切换npm的淘宝镜像 安装Vue-cli ​编辑 Vue2入门 引入vue.js文件 入门代码 常用指令 生…

眼在手外-机器人坐标系与相机坐标系标定方法

1 眼在手外坐标系概述 实现机械臂和相机的手眼标定&#xff0c;就是要通过双目相机坐标系、机械臂坐标系和机械臂 末端执行器三者的坐标系转换&#xff0c;求出手眼转换矩阵。设双目相机坐标系为 Oc&#xff0c;标定板坐标 系为 Ow&#xff0c;末端执行器坐标系为 Oe&#xff0…

【学习笔记】Day 3

一、进度概述 1、作业1 2、组会会议纪要——没太听懂&#xff0c;得再看 二、详情 1、作业1 &#xff08;1&#xff09;在python中&#xff0c;想要使output为图片&#xff0c;需要用的matplotlib库&#xff0c;这里做简单的整理&#xff0c;以便更好的理解代码。 …

ADC的介绍和工作原理

一&#xff0c;什么是ADC&#xff1f; Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 什么是ADC&#xff1a; ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 SUCH AS: 12 位 ADC 是一种逐次逼近…

免费【2024】springboot 导师选择管理系统的管理设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

从零入门 AI for Science(AI+药物) 笔记 #Datawhale AI 夏令营

&#x1f496;使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset . 魔搭高峰期打不开Task3又换回飞桨了 吧torch 架构换成了 飞桨的paddle 飞桨AI Studio星河社区-人工智能学习与实训社区 https://aistudio.baidu.com/projectdetail/8191835?cont…

解决电脑数字小键盘经常自动关闭的问题

本文解决了电脑数字小键盘经常自动关闭的问题&#xff0c;可供大家参考。 winR&#xff0c;输入regedit打开注册表 依次选择HKEY_USERS DEFAULT Control Panel---Keyboard”&#xff0c;将InitialKeyboardIndicators的值由2147483648改为80000002&#xff0c;即可解决。

xss漏洞(四,xss常见类型)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 1&#xff0c;本文基于dvwa靶场以及PHP study进行操作&#xff0c;靶场具体搭建参考上一篇&#xff1a; xss漏洞&#xff08;二&#xff0c;xss靶场搭建以及简单…

[240804] OpenTofu 1.8.0 发布,带来更友好的编码体验 | 生成式 AI 滥用现象分析

目录 OpenTofu 1.8.0 发布&#xff0c;带来更友好的编码体验生成式 AI 滥用现象分析 OpenTofu 1.8.0 发布&#xff0c;带来更友好的编码体验 OpenTofu 1.8.0 现已发布&#xff0c;主要功能包括&#xff1a; 变量和局部值的早期求值: 现在可以在模块源、后端配置和状态加密等更…

西部数据HDD和闪存业务均在复苏加速

财务概览 西部数据&#xff08;Western Digital&#xff09;截至2024年7月341日的第四财季营收达到37.6亿美元&#xff0c;同比增长41%&#xff0c;超出预期的33亿美元&#xff0c;净利润达到3.3亿美元&#xff0c;与去年同期亏损7.15亿美元形成鲜明对比。整个2024财年的营收增…

C语言初阶(12)

1.调试的基本 调试是发现并解决C语言编译的bug的方法。 调试基本步骤是1.发现程序错误的存在 2.以隔离、消除等方式对错误进行定位 3.确定错误产生的原因 4.提出纠正错误的解决办法 5.对程序错误予以改正&#xff0c;重新测试 编译版本release和debug版本&#xff0c;releas…

一例AutoHotkey语言生成的文件夹病毒分析

概述 这是一个使用AutoHotkey语言编写的文件夹病毒&#xff0c;使用ftp服务器来当作C2&#xff0c;通过U盘传播&#xff0c;样本很古老&#xff0c;原理也很简单&#xff0c;这种语言的样本还是第一次见到&#xff0c;记录一下。 样本的基本信息 PE32库: AutoIt(3.XX)[-]编译…

Cocos Creator2D游戏开发(11)-飞机大战(9)-cocos发布微信小游戏

准备工作: ① cocosCreator ②微信小游戏开发者工具 第一步: cocosCreator 打包编译,设置发布平台,默认场景,设备方向,AppId 最后点击构建 等待构建完成 第二步: 导入微信开发者工具 就是cocos Creator 中构建发布里面的发布路径 然后编译: 剩下的就是微信开发者工具…

Bootstrap框架介绍

1、Bootstrap框架的下载和使用 Bootstrap框架是基于HTML、CSS、JavaScript的CCS/HTML框架,是一种封装好的前端框架。它包括js、css、front字体样式库。该框架下载链接:https://v3.bootcss.com/getting-started/#download,并选择下载源码。 建一个BootstrapDemo文件夹,将js…

反激式电源为什么上电最容易烧MOS管?

大家好,这里是大话硬件。 这篇文章总结一下最近在研究的反激电源RCD吸收回路和VDS尖峰问题。这也是为什么MOS管在开机容易被电压应力击穿的原因。 下图是反激电源变压器部分的拓扑。 在MOS开通时,VDS上电压: 由于Rdson比较小,MOS开通时,VDS电压也较小。此时,MOS漏极电…

对象存储及其相关概念介绍

对象存储是一种用来描述解决和处理离散单元&#xff08;这些离散单元被称作为对象&#xff09;的方法的通用术语。以下是关于对象存储的详细解析&#xff1a; 一、基本概念 定义&#xff1a;对象存储&#xff0c;也叫做基于对象的存储&#xff0c;是一种将数据以对象的形式进…

【过题记录】8.4(robocom补题,网络流)

今天robocom国赛&#xff0c;因为一个bool函数忘记return 1而裂开(错失21分) 以此为戒 贪心消消乐 其实就是一个求最大子矩阵和的板子题 利用最大子段和的思想 枚举矩阵中的上下界 压成一维后利用最大子段和 O ( n ) O(n) O(n)处理 复杂度 O ( n 3 ∗ k ) O(n^3*k) O(n3∗k) k为…

VSCode开发Go的精准定位

下载Golang安装包 Download and install - The Go Programming Languagehttps://golang.google.cn/doc/install 安装完成后,配置go env go env -w GO111MODULE=on go env -w GOPROXY="https://goproxy.io,direct"