利用AOP切面打印项目中每个接口的运行情况
1、前言
AOP切面技术,大家应该都听知道,Spring框架的主要功能之一。
AOP切面的用途很广,其中一个常见的用途就是打印接口方法的运行日志和运行时间。
日志对于一个项目很是重要,不仅有助于调错,还是后期大数据分析的重要数据来源,这里我就简单介绍一下如何在SpringBoot中利用AOP切面打印后端接口的运行情况。
2、切面代码
实现方式很简单,在SpringBoot工程中,增加切面类,代码如下:
import cn.zhuifengren.util.JsonUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @Aspect
@Component
@Order(Integer.MIN_VALUE)
public class MyAspect { public static final Logger log =
LoggerFactory.getLogger(MyAspect.class); @Around("execution(* cn.zhuifengren.controller..*Controller.*(..))")
public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable { // 记录开始时间
long begin = System.currentTimeMillis(); log.info("类信息:{}", joinPoint.getTarget().getClass());
log.info("方法名:{}", joinPoint.getSignature().getName()); // 获得request对象
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) requestAttributes;
HttpServletRequest req = sra.getRequest();
log.info("请求地址: {}",req.getRequestURI());
log.info("请求设备: {}", req.getHeader("user-agent")); // 获得参数
Object[] args = joinPoint.getArgs();
if (args!=null && args.length>0){
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse)
continue;
log.info("参数:" + ( args[i]==null? "": JsonUtils.objectToJson(args[i])));
}
} // 执行目标 service
Object result = joinPoint.proceed();
log.info("响应:" + JsonUtils.objectToJson(result)); // 记录结束时间
long end = System.currentTimeMillis();
long time = end - begin; log.info("执行时间:{} 毫秒", time); return result;
} }
3、代码说明
1)@Aspect 和 @Component 两个注解是切面类必须的,用于标识这是个切面类。
2)@Order(Integer.MIN_VALUE) 注解用于设置切面的执行顺序,值越小,切面越早被执行。
3)@Around("execution(* cn.zhuifengren.controller..*Controller.*(..))")
众所周知,AOP切面的通知方式有5种,方法执行前通知、方法正常执行后通知、环绕通知、方法执行异常通知、最终通知。
这里的 @Around 就是环绕通知,也就是方法执行前后都会通知。
execution(* cn.zhuifengren.controller..*Controller.*(..)) 是切面表达式,用于指定哪些方法会被通知。
第一个 * 代表方法返回类型 *代表所有类型;
包名代表aop监控的类所在的包;
.. 代表该包以及其子包下的所有类方法;
*Controller 代表类名,代表所有以Controller结尾的类,如果包括所有类,则直接写 * ;
*(..) 中 *代表类中的方法名,(..)表示方法中的任何参数。
4)ProceedingJoinPoint joinPoint, 此对象是切面方法的参数,从中可以得到方法的请求参数,也用于执行方法得到响应值。
5)joinPoint.getArgs() 获得参数。
6)Object result = joinPoint.proceed(),执行方法,并得到返回值
4、日志效果

利用AOP切面打印项目中每个接口的运行情况的更多相关文章
- 利用CocoaPods,在项目中导入AFNetworking类库
场景1:利用CocoaPods,在项目中导入AFNetworking类库 AFNetworking类库在GitHub地址是:https://github.com/AFNetworking/AFNetw ...
- Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId
一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...
- SpringBoot2.x整合Email并利用AOP做一个项目异常通知功能
因为不知aop能干嘛,因此用aop做个小功能,再结合最近学的springboot-Email做了个系统异常自动邮件通知的功能, 感觉满满的成就感. AOP不懂的可以看上一篇:https://www.c ...
- 关于JAVA项目中的常用的异常处理情况总结
1. JAVA异常处理 在面向过程式的编程语言中,我们可以通过返回值来确定方法是否正常执行.比如在一个c语言编写的程序中,如果方法正确的执行则返回1.错误则返回0.在vb或delphi开发的应用程序中 ...
- 对java异常的总结及java项目中的常用的异常处理情况
文章涉及内容来源:黑马程序员自学整理的笔记,网上查阅资料,以及转载名为墨钺的博客大佬,附上博客转载地址:https://www.cnblogs.com/gothic-death/p/9946415.h ...
- JAVA项目中的常用的异常处理情况总结
可能遇见的异常或错误: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的.例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略. 运行时异常: ...
- JAVA项目中的常用的异常处理情况
NO.1 java.lang.NullPointerException 这个异常比较容易遇到,此异常的解释是“程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现 ...
- 提升Spring Boot项目中API接口并发能力的一个注解,效果明显
异步调用几乎是处理高并发Web应用性能问题的万金油,那么什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次 ...
- Vue项目中的接口进阶使用
创建services文件夹 1.文件夹apis.index.request的三个文件. 2.apis文件放接口 export const apis = { checkDeviceNo: '/api/c ...
随机推荐
- Springboot中注解@Configuration源码分析
Springboot中注解@Configuration和@Component的区别 1.先说结论,@Configuration注解上面有@Component注解,所以@Component有的功能@Co ...
- 微信小程序云开发-数据库-用户更新数据并提交
一.wxml增加input输入框和[更新商品价格]按钮 在商品详情页新增[更新商品价格]按钮,wxml新增部分代码,input绑定事件,用于获取用户输入的内容.按钮绑定事件,用于更新商品价格. 二. ...
- [考试总结]noip模拟10
不小心有咕掉了一段时间 这次考试咕掉的分数也是太多了 然后就是这次暴力完全没有打满 遗憾啊遗憾 T1 入阵曲 前面的题目背景故意引导我们去往矩阵快速幂的方向去想 然而半毛钱关系没有 其实就是维护前缀和 ...
- 算法优化---素数(质数)(Java版)
4.1优化算法-----输出素数 最简代码请直接移步文末 原代码:https://www.cnblogs.com/Tianhaoblog/p/15077840.html 对应优化如下 优化一:在遍历内 ...
- 浏览器WEB Browser 常识
浏览器WEB Browser 浏览器发展史 浏览器诞生与发展 浏览器的诞生 早期浏览器 Netscape Internet Explorer 与浏览器战争 chrome的崛起 时代之泪 IE浏览器终成 ...
- 🏆【Java技术专区】「并发编程专题」教你如何使用异步神器CompletableFuture
前提概要 在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明显的缺点,就是,没有返回值.这时候,大家可能会去尝试使用Callable中的 ...
- 大数据学习(11)—— Hive元数据服务模式搭建
这一篇介绍Hive的安装及操作.版本是Hive3.1.2. 调整部署节点 在Hadoop篇里,我用了5台虚拟机来搭建集群,但是我的电脑只有8G内存,虚拟机启动之后卡到没法操作,把自己坑惨了. Hive ...
- python代码下载m3u8视频
代码如下: # -*- coding: utf-8 -*- import requests import re import os import base64 from Crypto.Cipher i ...
- Yara规则学习
01 定义 官网: YARA is a tool aimed at (but not limited to) helping malware researchers to identify and c ...
- preg_replace函数/e 模式下的代码执行+一道例题
目录 例一 例二 补充 看一道ctf题-----[BJDCTF2020]ZJCTF,不过如此 参考链接 例一 源码: <?php preg_replace('/(.*)/ei', 'strtol ...