Spring AOP 使用方法总结
AOP切面编程的最佳应用场景
- 记录日志
- 性能监控
- 事务管理
- 处理异常
- 数据验证,验证传入参数的正确性(一般不用这个方法做,而是用拦截器)
spring提供了以下注解供开发者使用,编写AOP程序
- @Aspect 申明切面
- @Pointcut 切点,申明AOP的作用范围(如:一个类下所有方法,某个方法,带有指定注解的方法)
- @Before 前置通知
- @After 后置通知
- @Around 环绕通知
- @AfterThrowing 异常通知,当被切入点中代码执行异常时触发
实操
举个例子
- 定义
如果我希望在上面方法使用AOP,定义一个类,实现如下@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);} }@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点就够了。
- 前置通知/后置通知的参数是
org.aspectj.lang.JoinPoint - 环绕通知的参数是
org.aspectj.lang.ProceedingJoinPoint - 被切入点的参数信息都被封装到
JoinPoint或ProceedingJoinPoint中,直接从中获取即可【注意类型】
特殊的切入方法——异常通知
研究中,未完成
相关文章:
Spring AOP 使用方法总结
AOP切面编程的最佳应用场景 记录日志性能监控事务管理处理异常数据验证,验证传入参数的正确性(一般不用这个方法做,而是用拦截器) spring提供了以下注解供开发者使用,编写AOP程序 Aspect 申明切面Pointcut 切点&#…...
LeetCode 每日一题 2024/10/21-2024/10/27
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/21 910. 最小差值 II10/22 3184. 构成整天的下标对数目 I10/23 3185. 构成整天的下标对数目 II10/24 3175. 找到连续赢 K 场比赛的第一位玩家10/25 3180. 执行操作可获得…...
不到1500元的I卡可以玩转3A大作吗?撼与科技Intel Arc A750显卡游戏性能实
一、前言 还记得2022年10月的时候,英特尔发布了Arc A750和A770显卡,和此前所发布的DG1、A380不同,这两张显卡可以说是真正意义上的游戏显卡。不知不觉间,两年已经过去了,在这两年期间,英特尔不仅在积极地打…...
STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数
文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座,并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站,可见性分析确定地面站坐标分析单颗…...
js面试问题笔记(一)
一.热门js面试 1.简述同步和异步的区别? 同步: 浏览器访问服务器请求,用户看到页面刷新 ,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作 异步: 浏览器访问服务器请求,用户正常操作,浏览器后端进行请求,等请求完,页面不刷新,新内容也会出现,用户看到…...
pip 和 pipx 的主要区别?
特性pippipx用途用于安装Python库或命令行应用程序,可以安装带entry points的库专门用于安装和管理Python命令行工具,每个工具都在隔离的虚拟环境中运行虚拟环境不自动创建虚拟环境,需要手动使用 venv 或 virtualenv 创建自动为每个安装的工具…...
4457M数字示波器
_XLT新利通_ 4457M数字示波器 带宽500MHz到3GHz 4457M系列数字示波器产品,包含4457DM/EM/FM/GM四个产品型号,模拟通道数4、8个,带宽500MHz到3GHz,最高采样率10GSa/s,垂直分辨率8bit,最大存储深度2Gpts。…...
【永中软件-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
Tomcat作为web的优缺点
文章目录 优点缺点 优点 开源:Tomcat是Apache软件基金会的一个项目,这意味着它是免费且开放源代码的。这为开发者提供了高度的自由度来修改和扩展其功能。 轻量级:与一些全功能的Java EE应用服务器(如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键在属性之间进行切换 与一个变迁相关联的四个铭文,均为可选项: 变迁名称守卫(Guard)时间代码段 变迁延迟必须是一个正整数表达式。该表达式前面加上,这意味着时间铭文的形式为 delayexpr。在添加时间铭文之前,铭文的默…...
一个简单的例子,说明Matrix类的妙用
在Android、前端或者别的平台的软件开发中,有时会遇到类似如下需求: 将某个图片显示到指定的区域;要求不改变图片本身的宽高比,进行缩放;要求最大限度的居中填充到显示区域。 以下示意图可以简单描绘该需求 以Androi…...
【C++】类和对象(四):析构函数
大家好,我是苏貝,本篇博客带大家了解C的析构函数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1. 概念2. 特性 1. 概念 通过前面构造函数的学习,我们知道一个对象是怎么来的…...
linux中各目录作用及介绍
目录 1 /usr 1 /usr /usr 是 Unix-like 操作系统中的一个重要目录之一,代表可共享的用户资源(User System Resources)或 Unix Software Resource(UNIX 软件资源)。 /usr 目录通常包含了系统的许多可共享资源…...
v4.7版本使用线下付款方式不给管理员发送新订单通知问题修复
在app/api/controller/v1/order/StoreOrderController.php文件中,将红框内的代码注释,加上绿框的代码即可修复 if ($this->services->setOrderTypePayOffline($order[order_id])) {event(NoticeListener, [$order, admin_pay_success_code]);retur…...
vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?
在 Vue 中,Mitt 和 Pinia 是两个不同的工具,它们的主要用途和功能有所不同,但在某些方面也存在重合的部分。 区别 Mitt: Mitt 是一个简单而强大的事件总线库,用于在组件之间进行事件的发布和订阅。 它提供了一种简洁…...
飞书文档解除复制限制
解除飞书文档没有编辑器权限限制复制功能方法 方法一:使用插件 方法二: 通过调试工具删除所有的copy事件 使用插件 缺点: 只有markdown格式,如果需要其他格式需要再通过Typora等markdown编辑器转pdf,word等格式 安装插件 Cloud Do…...
vue3中ref和reactive的用法,区别和优缺点,以及使用场景
写在前头: reactive定义的数据只能修改里面的属性,不能将整个数据替换,实在要替换请使用 Object.assign(obj1, obj2);举个例子 这种写法无法直接改变obj1 let obj1 reactive({name: 猫,age: 2, });obj1 {name: 猪,age: 2, } 正确的写法…...
电脑技巧:Rufus——最佳USB启动盘制作工具指南
目录 一、功能强大,兼容性广泛 二、界面友好,操作简便 三、快速高效,高度可定制 四、安全可靠,社区活跃 在日常的电脑使用中,无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务,拥…...
vue的基本使用
简介 vue组件 三个部分组成:结构、样式、逻辑文本插值 类似于java的spel表达式属性绑定 綁定是单向绑定的,修改输入框无法改变原本的,只能读,不能写 <input :value="name" placeholder="Type your name"><script> export default {name: H…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...
