java Web-Spring AOP

news2024/9/22 10:01:12

AOP的概念

AOP:面向切面编程,面向方法编程。简单理解就是对特定方法的扩充的思想

例如我们要在特定方法进行方法的执行时间判断,我们假如去使用在每个方法去进行业务逻辑扩充,这样就太繁琐了,而使用AOP就可以简化操作。Spring AOP 底层是通过动态代理技术实现的,要想查看动态代理可以查看我之前的文章 动态代理技术。

AOP 的组成

切面

AOP 是面向 切面编程,所以这是 AOP 最重要的功能。定义 AOP 是针对哪个统一的功能,这个功能就叫做一个切面。比如用户登录功能或方法的统计日志,他们就各自是一个切面。切面是由 切点 和 通知组成的。

连接点
就是所有可能触发 AOP(拦截方法的点),就称为连接点。

切点
切点会提供一个规则,用来匹配连接点,并且来实现通知。也就是在何处执行通知。

通知
重复的共性功能就是通知。就是规定 AOP 执行的时机和执行的方法,就是切点处的执行动作通知注解如下:

前置通知: 使用 @Before,通知方法会在目标方法调用之前执行。
后置通知: 使用 @After,通知方法会在目标方法返回或者抛出异常后调用。
返回之后通知: 使用 @AfterReturning,通知方法会在目标方法返回后调用。有异常不调用
抛异常后通知: 使用 @AfterThrowing,通知方法会在目标方法抛出异常后调用。
环绕通知: 使用 @Around通知包裹了被通知的方法,在被通知的方法通知之前和调用之后,执行自定义的行为。注意:1.AOP方法内需要调用procedingJoinPoint.proceed();方法来执行原始方法。2.Around环绕通知的返回值必须指定为Object来接收原始方法返回值

使用步骤

1.导入AOP依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.编写AOP程序 

1.定义模板方法类,加上注解@Component交给IOC容器管理,还要加上@Aspect注解声明这是一个AOP类。

2.声明切点并定义通知:使用@PointCut注解注解一个方法来声明切点,也可以直接把表达式放入通知注解的参数中接收来声明切点

//方式一
@pointcut("切入点表达式)")
private void pt(){}//声明切点

@Before("pt()")
public void beforeTest(){
loog.info("beforeTest");
}
//方式二

@Before("切入点表达式")
public void beforeTest(){
loog.info("beforeTest");
}

 通知的执行顺序

当有多个切面的切入点都匹配到了目标方法时,多个通知方法都会被执行。

默认情况下顺序和切面类的类名大小有关,before通知类名靠前的 先执行,after通知类名靠前的 后执行。

我们可以通过@Order(数字)注解加在AOP类上来指定切面类控制顺序,before通知类数字小的 先执行,after通知数字小的 后执行。

切入点表达式

1.execution(...)

根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配

语法:

execution([访问修饰符] 返回值 [包名.(类名./接口名.)]方法名(方法参数,要填全类名) [throws 异常])

可以使用通配符描述切入点:

*: 单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分

案例:

execution(* com .*. service .*. update*(*))

.. : 多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数

案例:

execution(* com.test .. DeptService .* ( .. ))

想要同时匹配多个连接点,可以使用||来连接

execution(* com.test.service. DeptService.list ()) || execution(* com.test.service. DeptService.delete (java. lang. Integer) ) 

2.@annotation(...)

根据标识注解进行匹配

语法:

@annotation(注解的全类名)

1.首先自定义一个注解用来标记匹配方法

@Retention(RetentionPolicy.RUNTIME)//元注解,运行时有效
@Target(ElementType.METHOD)//元注解,注解属性为方法上
public @intetface Mytest{}

2.在要切入的方法上加上注解

@MyTest
@Override
public List<dept> list{
List<dept> deptList =deptMapper.list();
return deptList;
}

@MyTest
@Override
public List<dept> delete{
deptMapper.delete(id);
}

3.使用切入点表达式

连接点

在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。我们可以在形参中声明参数来获取到他的对象。

  • 对于@Around 通知,获取连接点信息只能使用 ProceedingJoinPoint
  • 对于其他四种通知,获取连接点信息只能使用JoinPoint,它是 ProceedingJoinPoint 的父类型
@Around("execution(...)")

public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

String className= joinPoint.getTarget().getClass().getName();//获取目标类名

Signature signature = joinPoint.getSignature();//获取目标方法签名

String methodName= joinPoint.getSignature().getName();//获取目标方法名

Object[] args= joinPoint.getArgs();//获取目标方法运行参数

Object res =joinPoint.proceed();//执行原始方法,获取返回值(环绕通知)

return res;

}
@Before("execution(...)")

public void before(JoinPoint joinPoint) {

String className = joinPoint.getTarget().getClass().getName();//获取目标类名

Signature signature= joinPoint.getSignature();//获取目标方法签名

String methodName=joinPoint.getSignature().getName();//获取目标方法名

Object[] args=joinPoint.getArgs();//获取目标方法运行参数

}

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

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

相关文章

vue3中web前端JS动画案例(四)侧边栏横幅效果-右下角广告-淘宝案例

myJsAnimation.js, 这里使用了上次封装的动画方法&#xff0c;并进行了改造 /*** 动画的函数* dom 当前对象* JSON 传入元素对象的属性 {"width": 300, "opacity": 50}* * -------------------- 多物体运动&#xff0c;同时运动 ---传入JSON-------------*…

Unity Shader 图形学【笔记一】

游戏图形学 源自&#xff1a;计算机图形学 涵盖&#xff1a;图形、动画的创建渲染展示 目标&#xff1a;性能优化、提高视觉质量&#xff0c;增强用户体验 技术&#xff1a;三维模型、纹理、光照、阴影、特效、动画、物理模拟、碰撞检测等 Unity Shader 是&#xff1a;un…

力扣-1844.将所有数字用字符替换

思路&#xff1a; 1. class Solution:&#xff1a;定义了一个名为 Solution 的类&#xff0c;用于包装解决问题的方法。 2. def replaceDigits(self, s: str) -> str:&#xff1a;定义了一个名为 replaceDigits 的方法&#xff0c;该方法接受一个字符串 s 作为参数&#x…

gitee / github 配置git, 实现免密码登录

文章目录 怎么配置公钥和私钥验证配置成功问题 怎么配置公钥和私钥 以下内容参考自 github ssh 配置&#xff0c;gitee的配置也是一样的&#xff1b; 粘贴以下文本&#xff0c;将示例中使用的电子邮件替换为 GitHub 电子邮件地址。 ssh-keygen -t ed25519 -C "your_emai…

Kotlin语法快速入门--条件控制和循环语句(2)

Kotlin语法入门–条件控制和循环语句&#xff08;2&#xff09; 文章目录 Kotlin语法入门--条件控制和循环语句&#xff08;2&#xff09;二、条件控制和循环语句1、if...else2、when2.1、常规用法2.2、特殊用法--并列&#xff1a;2.3、特殊用法--类型判断&#xff1a;2.4、特殊…

OLED透明屏的寿命如何?

OLED透明屏的寿命一般在20年左右&#xff0c;但如果是旧款&#xff0c;其寿命可能会缩短至15年左右。然而&#xff0c;这个数字并不是绝对的&#xff0c;因为不同用户的使用和保养方法会导致OLED透明屏的寿命出现延长或缩短。例如&#xff0c;长时间使用或在强光、高对比度高亮…

力扣刷题学习python(跟随视频学着刷)

使用入门 视频链接 【手把手带你刷Leetcode力扣&#xff5c;各个击破数据结构和算法&#xff5c;大厂面试必备技能【已完结】-哔哩哔哩】 https://b23.tv/vIcRT61 时空复杂度 时间&#xff1a; 空间&#xff1a;主要有O(1)和O(n)两种 数组 特点&#xff1a;适合读多写少 操作…

Leetcode 118 杨辉三角

目录 一、问题描述二、示例及约束三、代码方法一&#xff1a;数学 四、总结 一、问题描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。   在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 二、示例及约束 示例 1&#xff1a…

SQL的基础语句

1、select语句 select colums from table_name 2、条件语句 #查询出查询出用户id为1和3的用户记录 IN 操作符允许我们在 WHERE 子句中规定多个值。 select * from student where id in (1,3) #查询出所有姓王的同学 模糊查询 like 通配符(% 任意多个字符 _单个字符) #下例…

AR HUD_VSLAM+显示技术

智能座舱的一个重要技术方向是表达与展示。HUD可以将驾驶相关的信息&#xff0c;如车速、导航等投射到驾驶员的视线上方&#xff0c;避免驾驶员的目光离开前方道路。这种显示方式可以提供关键信息的实时展示&#xff0c;减少驾驶员的分心。 HUD的技术原理就是通过光学系统将信息…

突破文化壁垒:海外社交媒体营销的内容创新与个性化策略

随着全球化的加速和互联网的普及&#xff0c;海外社交媒体营销已成为企业拓展国际市场、提升品牌影响力的重要手段。然而&#xff0c;如何在众多品牌中脱颖而出&#xff0c;吸引海外用户的关注&#xff0c;却是一个值得深入探讨的问题。本文Nox聚星将和大家从内容创新和个性化策…

考研日常记录(upd 24.4.22)

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 文章目录 2024.4.18 周四课程情况&#xff1a;时间规划&#xff1a; 2024.4.19 周五课程情况&#xff1a;时间规划&#xff1a; 2024.4.20 周六2024.4.2…

GaussianEditor:快速可控的3D编辑与高斯飞溅

GaussianEditor: Swift and Controllable 3D Editing with Gaussian Splatting GaussianEditor&#xff1a;快速可控的3D编辑与高斯飞溅 Yiwen Chen*​1,2   Zilong Chen*​3,5   Chi Zhang2   Feng Wang3   Xiaofeng Yang2 陈怡雯 *​1,2 陈子龙 *​3,5 张驰 2 王峰 3 杨晓…

k8s集群资源编排清单文件解读

1、YAML 文件概述 k8s集群中对资源管理和资源对象编排部署都可以通过声明样式&#xff08;YAML&#xff09;文件来解决&#xff0c;也就是可以把需要对资源对象操作编辑到 YAML 格式文件中&#xff0c;我们把这种文件叫做资源清单文件&#xff0c;通过 kubectl 命令直接使用资源…

LTD271次升级 | 网站/小程序可设访问IP的黑白名单 • 官微中心支持PDF等办公文件预览与并分享 • 订单退款显示更详尽明细

1、新增IP访问限制功能&#xff1b; 2、订单新增交易号显示与退款明细显示&#xff1b; 3、自定义地址增加四级地区&#xff1b; 4、Android版App优化文件功能&#xff1b; 5、已知问题修复与优化&#xff1b; 01 官微中心 1) 新增IP限制访问功能 允许或者禁止某些 IP 或…

vue快速入门(四十)非父子组件通信

注释很详细&#xff0c;直接上代码 上一篇 新增内容 媒介js的创建发送组件发送事件示例接收组件接收事件示例 源码 App.vue <template><div id"app"><TessFirst></TessFirst><TestSecond></TestSecond></div> </templ…

Linux 引导过程与服务控制

Linux操作系统引导过程 完整启动过程 简化紧要关键步骤&#xff08;重点&#xff09; Linux系统开机引导过程&#xff1a; 1&#xff09;开机自检 检测硬件设备&#xff0c;找到能够引导系统的设备&#xff0c;比如硬盘 2&#xff09;MBR引导 运行MBR扇区里的主…

【STM32+HAL+Proteus】系列学习教程---RS485总线(收发仿真实现)

实现目标 1、掌握UART/USART/RS485等几个常见概念的区别 2、掌握RS485的逻辑电平、硬件接线等基础知识 3、具体实现目标&#xff1a;1、利用两个单片机组成RS485通信网络&#xff1b;2、两个单片机之间能实现正常收发数据。 一、串口、RS485等之间的关系 串口&#xff1a;是…

使用 Docker 部署 Draw.io 在线流程图系统

1&#xff09;介绍 Draw.io GitHub&#xff1a;https://github.com/jgraph/drawio Draw.io 是一款开源的绘制流程图的工具&#xff0c;拥有大量免费素材和模板。程序本身支持中文在内的多国语言&#xff0c;创建的文档可以导出到多种网盘或本地。无论是创建流程图、组织结构图…

vscode 解决无法创建临时文件。

报错&#xff1a; Fatal error: cant create C:\Users???y\AppData\Local\Temp\ccqkCS9j.o: No such file or directory 右击此 电脑 -> 属性 打开 系统信息 -> 高级系统设置 系统属性 -> 高级 -> 环境变量 将temp 和 tmp 改为其它英文路径 只更改用户变量…