Spring Boot 整合 AOP 实现接口切面日志

Spring Boot 整合 AOP 实现接口切面日志

什么是 AOP?

AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发人员将横切关注点(如日志记录、性能统计、安全性等)从主要业务逻辑中分离出来,以便更好地模块化和管理这些关注点。

AOP通过定义切面(Aspect)来实现这一目标,切面包含了通知(Advice)和切点(Pointcut),通知定义了在何时、何地执行横切逻辑,而切点定义了在何处执行横切逻辑。通过将切面与应用程序的其他部分进行连接,AOP可以实现横切关注点的统一管理和重用。

AOP通常用于解决跨越多个模块的横切关注点,例如日志记录、事务管理、安全性等。

在这里插入图片描述

我们可以简单的把 AOP 理解为贯穿于方法之中,在方法执行前、执行时、执行后、返回值后、异常后要执行的操作。

AOP相关术语

切面(Aspect): 对横切关注点进行封装的类,每个关注点体现为一个通知方法;通常使用 @Aspect 注解来定义切面。

通知(Advice): 切面必须要完成的各个具体工作,比如我们的日志切面需要记录接口调用前后的时长,就需要在调用接口前后记录时间,再取差值。通知的方式有五种:

  • @Before:通知方法会在目标方法调用之前执行
  • @After:通知方法会在目标方法调用后执行
  • @AfterReturning:通知方法会在目标方法返回后执行
  • @AfterThrowing:通知方法会在目标方法抛出异常后执行
  • @Around:把整个目标方法包裹起来,在被调用前和调用之后分别执行通知方法

连接点(JoinPoint): 通知应用的时机,比如接口方法被调用时就是日志切面的连接点。

切点(Pointcut): 通知功能被应用的范围,比如本篇日志切面的应用范围是所有 controller 的接口。通常使用 @Pointcut 注解来定义切点表达式。

代码实现 AOP 记录接口访问日志

整合 POM 依赖

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId>
</dependency>

定义 ApiLog 注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiLog {}

实现 ApiLogAspect 切面

@Slf4j
@Aspect
@Component
public class ApiLogAspect {@Pointcut("@annotation(com.itwenke.springbootdemo.aop.aspect.ApiLog) || @within(com.itwenke.springbootdemo.aop.aspect.ApiLog)")public void getLogAnnotation() {}@Around("getLogAnnotation()")public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();try {Object ans = joinPoint.proceed();return ans;} finally {log.info("执行耗时: {}#{} = {}ms",joinPoint.getSignature().getDeclaringType().getSimpleName(),joinPoint.getSignature().getName(),System.currentTimeMillis() - start);}}
}

编写 Controller 测试接口

@RequestMapping(path = "api/test")
@RestController
public class TestController {@RequestMapping(path = "hi")@ApiLog()public String hi() {return "hi";}@RequestMapping(path = "select")@ApiLog()public String select() throws InterruptedException {Thread.sleep(5000);return "select";}
}

接口测试

http://localhost:8080/api/test/hi
http://localhost:8080/api/test/select

2024-01-02 15:32:33.567  INFO 4548 --- [nio-8080-exec-2] c.i.s.aop.aspect.ApiLogAspect            : 执行耗时: TestController#hi = 0ms
2024-01-02 15:32:42.417  INFO 4548 --- [nio-8080-exec-5] c.i.s.aop.aspect.ApiLogAspect            : 执行耗时: TestController#select = 5005ms

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5233D误码测试仪

5233D误码测试仪 数字通信测量仪器 5233D误码测试仪主要用于数字光收发模块的误码性能测试。采用可更换接口板设计&#xff0c;可支持多种数字光收发模块&#xff0c;包括CFP、CFP2、CFP4、CFP8、CSFP、CXP、CXP2、DSFP、QSFP、QSFP、QSFP28、SFP、SFP、SFP28、XFP等。5233D误…

SpringCloud微服务 【实用篇】| Dockerfile自定义镜像、DockerCompose

目录 一&#xff1a;Dockerfile自定义镜像 1. 镜像结构 2. Dockerfile语法 3. 构建Java项目 二&#xff1a; Docker-Compose 1. 初识DockerCompose 2. 部署微服务集群 前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

【Java 21 新特性】顺序集合(Sequenced Collections)

1 摘要 引入新的接口表示具有定义的遇到顺序的集合。每个这样的集合都有一个明确定义的第一个元素、第二个元素&#xff0c;依此类推&#xff0c;直到最后一个元素。提供统一的API来访问它的第一个和最后一个元素&#xff0c;并以相反的顺序处理它的元素。 "生活只能向后…

企业签名分发对移动应用开发者有什么影响

企业签名分发是移动应用开发者在应用程序发布前测试、内部分发和特定的受众群体分发等方面比较常用的一种工具。那对于应用商城分发有啥区别&#xff0c;下面简单的探讨一下。 独立分发能力 通过企业签名分发开发者可以自己决定应用程序的发布时间和方式&#xff0c;不用受应用…

使用Wireshark进行网络流量分析

目录 Wireshark是什么&#xff1f; 数据包筛选 筛选指定ip 使用逻辑运算符筛选 HTTP模式过滤 端口筛选 协议筛选 包长度筛选 数据包搜索 数据流分析 数据包导出 Wireshark是什么&#xff1f; 通过Wireshark&#xff0c;我们可以捕获和分析网络数据包&#xff0c;查看…

项目管理流程指南:分解阶段

项目管理流程是项目管理始终不变的一个方面&#xff0c;尤其在瀑布式方法中。 项目管理协会&#xff08;PMI&#xff09;将这一流程定义为五个不同的阶段&#xff1a;启动、计划、执行、监控和收尾。这五个阶段已在全球范围内得到广泛认可和接受。下面来了解如何完成每个阶段&…

学生数据可视化与分析工具 vue3+flask实现

目录 一、技术栈亮点 二、功能特点 三、应用场景 四、结语 学生数据可视化与分析工具介绍 在当今的教育领域&#xff0c;数据驱动的决策正变得越来越重要。为了满足学校、教师和学生对于数据深度洞察的需求&#xff0c;我们推出了一款基于Vue3和Flask编写的学生数据可视化…

牛客周赛 Round 26 解题报告 | 珂学家 | 0-1 BFS + 状态机DP

前言 整体评价 T3是一道0-1 BFS题, 这样时间复杂度可以控制在O(n*m), 也可以用优先队列。 T4这类题型&#xff0c;在牛客Round周赛系列出现好多次了&#xff0c;要么状态机DP&#xff0c;要么容斥&#xff0c;如果n很大&#xff0c;就用矩阵幂优化。 欢迎关注 珂朵莉 牛客周…

LiveGBS流媒体平台GB/T28181常见问题-如何配置快照目录快照存储默认目录目录如何配置

LiveGBS流媒体平台GB/T28181常见问题-如何配置快照目录快照存储默认目录目录如何配置 1、快照目录2、指定快照目录3、搭建GB28181视频直播平台 1、快照目录 部署LiveGBS后&#xff0c; 再查看通道播放后 或是 获取通道快照后&#xff0c;就会在LiveSMS部署的服务器里面存储对应…

学Python到底能干什么?看这里就知道

学Python到底能干什么&#xff1f;看这里就知道 | Python是一种代表简单主义思想的语言&#xff0c;极其容易上手&#xff0c;并且功能非常强大&#xff0c;这也是我的第二计算机语言。 个人可以使用Python去做哪些事呢&#xff1f; ✅办公自动化场景&#xff1a; 每天要处理…

南昌找工作用什么APP或者招聘网站

南昌找工作用吉鹿力招聘网 通过吉鹿力招聘网&#xff0c;可以随时查看最新职位&#xff0c;跟踪简历投递动态&#xff0c;与正在进行招聘的CEO、部门负责人、HR在线沟通&#xff0c;查看其他候选人面试该职位后对面试官、公司环境的面试评价等&#xff0c;为求职者提供参考。 …

2024 年 9 款简单好用的 Windows 分区管理器软件

了解适用于 Windows 11 和 Windows 7 的 Windows 分区管理器的概念。本教程还列出了分区管理器软件&#xff1a; 购买新电脑&#xff1f;担心磁盘存储空间不足&#xff1f;你听说过分区吗&#xff1f;如果没有&#xff0c;这篇文章就是为你准备的。 在本文中&#xff0c;我们…