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切面打印项目中每个接口的运行情况的更多相关文章

  1. 利用CocoaPods,在项目中导入AFNetworking类库

    场景1:利用CocoaPods,在项目中导入AFNetworking类库 AFNetworking类库在GitHub地址是:https://github.com/AFNetworking/AFNetw ...

  2. Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId

    一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...

  3. SpringBoot2.x整合Email并利用AOP做一个项目异常通知功能

    因为不知aop能干嘛,因此用aop做个小功能,再结合最近学的springboot-Email做了个系统异常自动邮件通知的功能, 感觉满满的成就感. AOP不懂的可以看上一篇:https://www.c ...

  4. 关于JAVA项目中的常用的异常处理情况总结

    1. JAVA异常处理 在面向过程式的编程语言中,我们可以通过返回值来确定方法是否正常执行.比如在一个c语言编写的程序中,如果方法正确的执行则返回1.错误则返回0.在vb或delphi开发的应用程序中 ...

  5. 对java异常的总结及java项目中的常用的异常处理情况

    文章涉及内容来源:黑马程序员自学整理的笔记,网上查阅资料,以及转载名为墨钺的博客大佬,附上博客转载地址:https://www.cnblogs.com/gothic-death/p/9946415.h ...

  6. JAVA项目中的常用的异常处理情况总结

    可能遇见的异常或错误: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的.例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略. 运行时异常: ...

  7. JAVA项目中的常用的异常处理情况

    NO.1 java.lang.NullPointerException 这个异常比较容易遇到,此异常的解释是“程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现 ...

  8. 提升Spring Boot项目中API接口并发能力的一个注解,效果明显

    异步调用几乎是处理高并发Web应用性能问题的万金油,那么什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次 ...

  9. Vue项目中的接口进阶使用

    创建services文件夹 1.文件夹apis.index.request的三个文件. 2.apis文件放接口 export const apis = { checkDeviceNo: '/api/c ...

随机推荐

  1. apt-key Debian packages密钥管理命令

    adv子命令 Pass advanced options to gpg. With adv --recv-key you can e.g. download key from keyservers  ...

  2. IDEA搭建springmvc环境之后无故出现404

    其实这应该是IDEA的自身问题 打开项目结构

  3. Selenium3自动化测试【20】CSS定位元素

    CSS 指层叠样式表 (CascadingStyleSheets),CSS一种用来表现HTML或XML等文件样式的计算机语言,其能够灵活的为页面提供丰富样式的风格. CSS使用选择器为页面元素绑定属性 ...

  4. 如何使用Scala的ClassTag

    Scala官方文档中对于ClassTag的定义如下: ClassTag[T]保存着在运行时被JVM擦除的类型T的信息.当我们在运行时想获得被实例化的Array的类型信息的时候,这个特性会比较有用. 下 ...

  5. 【洛谷P1795 无穷的序列_NOI导刊2010提高(05)】模拟

    分析 map搞一下 AC代码 #include <bits/stdc++.h> using namespace std; map<int,int> mp; inline int ...

  6. user-agent浏览器标识集合

    user_agent_list = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET ...

  7. LVM磁盘配额

    目录 一.LVM概述 1.1.逻辑卷管理 1.2.LVM机制的基本概念 二.LVM管理命令 三.磁盘配额概述 3.1.实现磁盘配额的条件 3.2.Linux磁盘限额的特点 3.3.常用命令及选项 3. ...

  8. [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构

    [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 目录 [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 0x00 摘要 0x01使用 1.1 配置 ...

  9. 字节跳动前技术总监开源分享《Android架构设计权威指南》,YYDS!

    架构就像是一场进化史,根据不同时期的需求,演变出不同的架构,车轮滚滚,到今天,移动端框架百花齐放,让人目不暇接.但是其中的本质是磨灭不了的,换言之根本没有磨灭而是隐藏到了人们所看不到的地方,但是依旧发 ...

  10. Git8.3k星,十万字Android主流开源框架源码解析,必须盘

    为什么读源码 很多人一定和我一样的感受:源码在工作中有用吗?用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已. 那为什么我还要读源码呢?一刚开始 ...