当前位置: 首页 > news >正文

Spring AOP 使用方法总结

AOP切面编程的最佳应用场景

  • 记录日志
  • 性能监控
  • 事务管理
  • 处理异常
  • 数据验证,验证传入参数的正确性(一般不用这个方法做,而是用拦截器)

spring提供了以下注解供开发者使用,编写AOP程序

  • @Aspect 申明切面
  • @Pointcut 切点,申明AOP的作用范围(如:一个类下所有方法,某个方法,带有指定注解的方法)
  • @Before 前置通知
  • @After 后置通知
  • @Around 环绕通知
  • @AfterThrowing 异常通知,当被切入点中代码执行异常时触发

实操

举个例子

  1. 定义
    @RestController
    @RequestMapping(path = {"test"})
    public class DemoController {@GetMapping(path = {"test01/{name}"})public ResponseEntity<String> test01(@PathVariable("name") String name) {return new ResponseEntity<>(name.toUpperCase(), HttpStatus.OK);}
    }
    
    如果我希望在上面方法使用AOP,定义一个类,实现如下
    @Slf4j
    @Aspect
    @Component
    public class AOPAction {// 定义切点,标记此切点在什么范围内此切面起作用@Pointcut("execution(* com.train.controller.DemoController.test02(..))")public void pointcut() {}//前置通知@Before(value = "pointcut()")public void before(JoinPoint joinPoint) {log.info("Before Method : {}...{}", joinPoint.getSignature().getName(), args[0].toString());}// 后置通知@After(value = "pointcut()")public void after(JoinPoint joinPoint) {log.info("After Method : {}...{}", joinPoint.getSignature().getName(), args[0].toString());}// 环绕通知@Around(value = "pointcut()")public Object around1(ProceedingJoinPoint joinPoint) throws Throwable {log.info("Around 1 Method before: {}...", joinPoint.getSignature().getName());Object result = joinPoint.proceed();log.info("Around 1 Method after: {}...", joinPoint.getSignature().getName());return result;}
    }
    

切点执行范围

此章节介绍多种切点定义形式,开发中使用哪一种视情况而定

1.指定包下所有类的所有方法

应用在此包下所有类的所有方法上

// 包名:com.train.controller
@Pointcut("execution(* com.train.controller..*.*(..))")
public void pointcut() {}

2.指定类中所有方法

应用在指定类的所有方法上

// 全类名:com.train.controller.DemoController
@Pointcut("execution(* com.train.controller.DemoController.*(..))")
public void pointcut() {}

3.指定某个类中某个方法

应用在指定类的指定方法上,而此类中的其他方法不会被应用

// 全类名:com.train.controller.DemoController
@Pointcut("execution(* com.train.controller.DemoController.test01(..))")
public void pointcut() {}

4.1 按参数数量指定

AOP切入点表达式规范中,用*表示一个参数,用表示无固定个数参数

可以这么理解:把*理解成通配符,且仅匹配一个。

// 仅作用在com.train.controller包下所有类中仅有2个参数的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(*,*))")
public void pointcut02(){}
// 仅作用在com.train.controller包下所有类中仅有5个参数的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(*,*,*,*,*))")
public void pointcut02(){}

4.2 按参数注解指定

⚠️ 研究中,未完成


5.加有指定注解的方法

仅应用在使用了注解的方法上,可以使用自定义注解,也可以使用框架提供注解。此形式最灵活,推荐开发中使用

// 自定义注解
public @interface LogPointCut {}
// 加注解的方法
@GetMapping(path = {"test/{name}"})
@LogPointCut
public ResponseEntity<String> test(@PathVariable("name") String name) {return new ResponseEntity<>(name.toUpperCase(), HttpStatus.OK);
}
// 定义
@Pointcut("@annotation(com.train.annotation.LogPointCut)")
public void pointcut() {
}

6.组合条件【难点】

使用A符合 Spring AOP 的切入点表达式规范组合多个条件,组合条件最好用&&连接各个条件。用+匹配接口。用*匹配一个。用匹配无固定数

举例

// 仅作用在com.train.controller包下所有类中所有标记了@LogPointCut注解的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(..)) && @annotation(com.train.spr.annotation.LogPointCut)")
public void pointcut02(){}
// 仅作用在com.train.spr.controller包下所有实现了MyInterface接口的类的方法上
@Pointcut(value = "execution(* (com.train.controller..* && com.train.spr.interfaces.MyInterface+).*(..))")
public void pointcut02(){}// 仅作用在com.train.spr.controller包下所有实现了MyInterface接口和MyInterface2接口的类的方法上
@Pointcut(value = "execution(* (com.train.controller..* " +"&& com.train.spr.interfaces.MyInterface+ " +"&& com.train.spr.interfaces.MyInterface2+ ).*(..))")
public void pointcut02(){}

当然!也可以组合多个已定义的条件作为一个条件,例如

import org.aspectj.lang.annotation.Pointcut;// 仅作用在com.train.spr.controller包下类的方法上
@Pointcut(value = "execution(* com.train.controller..*.*(..))")
public void pointcut01() {}// 仅作用在实现了MyInterface接口的类的方法上
@Pointcut(value = "execution(* com.train.spr.interfaces.MyInterface+.*(..))")
public void pointcut02() {}// 组合上述两个切入点的条件
@Pointcut(value = "pointcut02() && pointcut01()")
public void pointcut03() {}

AOP切入点表达式规范请查阅官网

获取参数

AOP的方法可以获取被切入方法的参数,但是修改这些参数并不会在被切入方法中生效。举个例子,方法A有一个前置通知方法B,且方法B获取方法A的参数,即便方法B中修改了参数值,方法A获取到的参数仍然不会改变,原来是怎样就是怎样

获取参数这块注意3点就够了。

  1. 前置通知/后置通知的参数是org.aspectj.lang.JoinPoint
  2. 环绕通知的参数是org.aspectj.lang.ProceedingJoinPoint
  3. 被切入点的参数信息都被封装到JoinPointProceedingJoinPoint中,直接从中获取即可【注意类型】

特殊的切入方法——异常通知

研究中,未完成

相关文章:

Spring AOP 使用方法总结

AOP切面编程的最佳应用场景 记录日志性能监控事务管理处理异常数据验证&#xff0c;验证传入参数的正确性&#xff08;一般不用这个方法做&#xff0c;而是用拦截器&#xff09; spring提供了以下注解供开发者使用&#xff0c;编写AOP程序 Aspect 申明切面Pointcut 切点&#…...

LeetCode 每日一题 2024/10/21-2024/10/27

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/21 910. 最小差值 II10/22 3184. 构成整天的下标对数目 I10/23 3185. 构成整天的下标对数目 II10/24 3175. 找到连续赢 K 场比赛的第一位玩家10/25 3180. 执行操作可获得…...

不到1500元的I卡可以玩转3A大作吗?撼与科技Intel Arc A750显卡游戏性能实

一、前言 还记得2022年10月的时候&#xff0c;英特尔发布了Arc A750和A770显卡&#xff0c;和此前所发布的DG1、A380不同&#xff0c;这两张显卡可以说是真正意义上的游戏显卡。不知不觉间&#xff0c;两年已经过去了&#xff0c;在这两年期间&#xff0c;英特尔不仅在积极地打…...

STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数

文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座&#xff0c;并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站&#xff0c;可见性分析确定地面站坐标分析单颗…...

js面试问题笔记(一)

一.热门js面试 1.简述同步和异步的区别? 同步: 浏览器访问服务器请求,用户看到页面刷新 ,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作 异步: 浏览器访问服务器请求,用户正常操作,浏览器后端进行请求,等请求完,页面不刷新,新内容也会出现,用户看到…...

pip 和 pipx 的主要区别?

特性pippipx用途用于安装Python库或命令行应用程序&#xff0c;可以安装带entry points的库专门用于安装和管理Python命令行工具&#xff0c;每个工具都在隔离的虚拟环境中运行虚拟环境不自动创建虚拟环境&#xff0c;需要手动使用 venv 或 virtualenv 创建自动为每个安装的工具…...

4457M数字示波器

_XLT新利通_ 4457M数字示波器 带宽500MHz到3GHz 4457M系列数字示波器产品&#xff0c;包含4457DM/EM/FM/GM四个产品型号&#xff0c;模拟通道数4、8个&#xff0c;带宽500MHz到3GHz&#xff0c;最高采样率10GSa/s&#xff0c;垂直分辨率8bit&#xff0c;最大存储深度2Gpts。…...

【永中软件-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

Tomcat作为web的优缺点

文章目录 优点缺点 优点 开源&#xff1a;Tomcat是Apache软件基金会的一个项目&#xff0c;这意味着它是免费且开放源代码的。这为开发者提供了高度的自由度来修改和扩展其功能。 轻量级&#xff1a;与一些全功能的Java EE应用服务器&#xff08;如IBM WebSphere, Oracle WebL…...

conda虚拟环境中安装cuda方法、遇到的问题

conda虚拟环境中安装cuda方法、遇到的问题 文章目录 conda虚拟环境中安装cuda方法、遇到的问题conda虚拟环境中安装cudacuda.h和cuda_runtime.hpytorch运行时的CUDA版本其他问题检查包冲突nvcc -V和nvidia-smi显示的版本不一致cuda路径 conda虚拟环境中安装cuda 参考文章&…...

【CPN TOOLS建模学习】设置变迁的属性

使用Tab键在属性之间进行切换 与一个变迁相关联的四个铭文&#xff0c;均为可选项&#xff1a; 变迁名称守卫(Guard)时间代码段 变迁延迟必须是一个正整数表达式。该表达式前面加上&#xff0c;这意味着时间铭文的形式为 delayexpr。在添加时间铭文之前&#xff0c;铭文的默…...

一个简单的例子,说明Matrix类的妙用

在Android、前端或者别的平台的软件开发中&#xff0c;有时会遇到类似如下需求&#xff1a; 将某个图片显示到指定的区域&#xff1b;要求不改变图片本身的宽高比&#xff0c;进行缩放&#xff1b;要求最大限度的居中填充到显示区域。 以下示意图可以简单描绘该需求 以Androi…...

【C++】类和对象(四):析构函数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的析构函数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1. 概念2. 特性 1. 概念 通过前面构造函数的学习&#xff0c;我们知道一个对象是怎么来的…...

linux中各目录作用及介绍

目录 1 /usr 1 /usr /usr 是 Unix-like 操作系统中的一个重要目录之一&#xff0c;代表可共享的用户资源&#xff08;User System Resources&#xff09;或 Unix Software Resource&#xff08;UNIX 软件资源&#xff09;。 /usr 目录通常包含了系统的许多可共享资源&#xf…...

v4.7版本使用线下付款方式不给管理员发送新订单通知问题修复

在app/api/controller/v1/order/StoreOrderController.php文件中&#xff0c;将红框内的代码注释&#xff0c;加上绿框的代码即可修复 if ($this->services->setOrderTypePayOffline($order[order_id])) {event(NoticeListener, [$order, admin_pay_success_code]);retur…...

vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?

在 Vue 中&#xff0c;Mitt 和 Pinia 是两个不同的工具&#xff0c;它们的主要用途和功能有所不同&#xff0c;但在某些方面也存在重合的部分。 区别 Mitt&#xff1a; Mitt 是一个简单而强大的事件总线库&#xff0c;用于在组件之间进行事件的发布和订阅。 它提供了一种简洁…...

飞书文档解除复制限制

解除飞书文档没有编辑器权限限制复制功能方法 方法一&#xff1a;使用插件 方法二&#xff1a; 通过调试工具删除所有的copy事件 使用插件 缺点&#xff1a; 只有markdown格式&#xff0c;如果需要其他格式需要再通过Typora等markdown编辑器转pdf,word等格式 安装插件 Cloud Do…...

vue3中ref和reactive的用法,区别和优缺点,以及使用场景

写在前头&#xff1a; reactive定义的数据只能修改里面的属性&#xff0c;不能将整个数据替换&#xff0c;实在要替换请使用 Object.assign(obj1, obj2);举个例子 这种写法无法直接改变obj1 let obj1 reactive({name: 猫,age: 2, });obj1 {name: 猪,age: 2, } 正确的写法…...

电脑技巧:Rufus——最佳USB启动盘制作工具指南

目录 一、功能强大&#xff0c;兼容性广泛 二、界面友好&#xff0c;操作简便 三、快速高效&#xff0c;高度可定制 四、安全可靠&#xff0c;社区活跃 在日常的电脑使用中&#xff0c;无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务&#xff0c;拥…...

vue的基本使用

简介 vue组件 三个部分组成:结构、样式、逻辑文本插值 类似于java的spel表达式属性绑定 綁定是单向绑定的,修改输入框无法改变原本的,只能读,不能写 <input :value="name" placeholder="Type your name"><script> export default {name: H…...

C#高级:利用 CancellationToken 实现方法超时控制,提升应用响应性

完整版&#xff1a; using System; using System.Threading; using System.Threading.Tasks;public class Program {public static async Task Main(){var cts new CancellationTokenSource();// 设置超时时间为10秒cts.CancelAfter(TimeSpan.FromSeconds(3));try{var resul…...

Java Lock LockSupport 总结

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & LockSupport & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & LockSupport & 总结》&#xff08;学习总结/最新…...

线性表之链式存储基本操作(c语言实现,附解析)

今天&#xff0c;我来讲一下数据结构链表的基本操作&#xff0c;首先我们要知道链表的基本操作有创建&#xff0c;查找&#xff0c;插入&#xff0c;删除。接下来我们逐一实现操作。 结构体定义 typedef struct Node* List; struct Node{ ElementType Data; List next; };文章…...

27.Redis哨兵架构

Redis哨兵高可用架构 Sentinel&#xff08;哨兵&#xff09;是一种特殊的 Redis 服务&#xff0c;其主要功能并非提供常规的读写服务&#xff0c;而是专门用于监控 Redis 实例节点。 1.在哨兵架构下&#xff0c;客户端&#xff08;client 端&#xff09;首次会从哨兵处找出 Re…...

BGP路由优选

BGP 的路由优选规则是一套多步决策链&#xff0c;用来确定在多个可行路由中选择最优的路由。BGP 是一种路径向量协议&#xff0c;通过这些优选规则&#xff0c;网络管理员可以控制数据流量的流向&#xff0c;确保网络的稳定性和效率。下面以一个实例来详细说明 BGP 的优选规则及…...

cjson内存泄漏问题注意事项

(1)使用root cJSON_Parse(text); //将字符串转成json格式&#xff0c;函数中申请了一块内存给root 所以在最后要释放root cJSON_Delete(root ); //释放cJSON_Parse()分配出来的内存空间 (2)使用out cJSON_Print(root);&#xff08;含有cJSON_PrintUnformatted函数&#x…...

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年&#xff0c;求伯君用128万行代码编写出了WPS1.0&#xff0c;宣告了中国自主办公时代的开启。 那时候&#xff0c;雷军还在武汉大学深造&#xff0c;他早就把求伯君当成了自己的榜样&#xff0c;这一来二去的&#xff0c;雷军和WPS之间也就结下了不解之缘…...

zookeeper全系列学习之分布式锁实现

文章目录 前言一、分布式锁的通用实现思路二、ZK实现分布式锁的思路三、ZK实现分布式锁的编码实现1、核心工具类实现2、测试代码编写线程安全问题复现使用上面封装的ZkLockHelper实现的分布式锁 优点缺点 总结 前言 就像上篇文章zookeeper全系列学习之统一配置获取说的&#x…...

耐用的内衣洗衣机有哪些?双11好用内衣洗衣机品牌排行榜

现代社会高速发展&#xff0c;人们对于生活品质的追求不断提高&#xff0c;内衣作为贴身衣物&#xff0c;其清洁程度直接关系到个人卫生和健康。因此&#xff0c;耐用且高效的内衣洗衣机成为了许多家庭的必需品。在双11购物节期间&#xff0c;众多品牌推出了各种优惠活动&#…...

富格林:曝光可信经验击败陷阱

富格林认为&#xff0c;现货黄金投资是一项收益与风险并存的交易活动。在现货黄金中&#xff0c;时常为投资者曝光总结一些可信的交易经验&#xff0c;能在必要时帮助投资者击败陷阱&#xff0c;同时也会获得较高概率的收益。如今的投资经验和策略是非常多的&#xff0c;以下是…...

个人房产信息查询网站/小红书外链管家

1) 在Action完成类方面的号码大全比照&#xff1a;Struts 1需求Action类承继一个笼统基类关键词挖掘工具&#xff1b;Struts 1的一个详细问题是运用笼统类编程而不是接口。Struts 2 Action类可以完成一个Action接口&#xff0c;也可以完成其他接口&#xff0c;使可选和定制的效…...

泉州网站建设泉州/山东关键词优化联系电话

本周主要复习了高数&#xff0c;感觉掌握了忘的比较快&#xff0c;所以在前几天主要是看了知识点&#xff0c;以及书上的例题&#xff0c;后几天就找了一些题做&#xff0c;物理在下周五考&#xff0c;中间的时间间隔较长&#xff0c;所以准备考完高数再复习。 而且上周的模拟考…...

甘露园网站建设/百度推广最近怎么了

saltstack使用jinja2增加了pillar模块pillar功能是帮助用户自定义一些变量&#xff0c;对于书写state file带来很大便利&#xff0c;同时增加了任务的隐藏性使用方法:在state file根目录同级目录建立pillar目录&#xff0c;书写sls配置文件pillar同样适用yaml格式&#xff0c;只…...

页面设计计划/北京seo业务员

LinkIt_for_RTOS_Firmware_Update_Developers_Guide--用于实时操作系统固件更新开发指南的MediaTek Linkit™开发平台 MediaTek Linkit™SDK v4支持固件空中更新(FOTA)更新&#xff0c;这是一种广泛采用的成本和时间高效的解决方案&#xff0c;用于更新连接设备上的固件。开发…...

哪些网站需要备案/怎么在百度发广告

采购单位&#xff1a;天津市房地产经济技术信息中心拟采购的内容&#xff1a;序号 型号 描述 数量 1 Oracle应用服务器套件软件 WebLogic Suite Processor 2cpu 2 Oracle数据同步检测软件 Oracle GoldenGate Veridata Processor 2cpu 3 Oracle数据同步核心软件 O…...

贵州省城市建设厅网站/关键词排名推广方法

大家好&#xff0c; 为提升上传图片的用户体验&#xff0c;我们已经把上传图片后再将图片插入文章的流程做了改进。自此&#xff0c;图片上传完毕后&#xff0c;直接点击后面的“插入”按钮&#xff0c;就可以直接把该图片插入编辑器内光标所在的位置了。如图&#xff1a; 另一…...