利用AOP切面打印项目中每个接口的运行情况

1、前言

AOP切面技术,大家应该都听知道,Spring框架的主要功能之一。

AOP切面的用途很广,其中一个常见的用途就是打印接口方法的运行日志和运行时间。

日志对于一个项目很是重要,不仅有助于调错,还是后期大数据分析的重要数据来源,这里我就简单介绍一下如何在SpringBoot中利用AOP切面打印后端接口的运行情况。

2、切面代码

实现方式很简单,在SpringBoot工程中,增加切面类,代码如下:

@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、日志效果

日志效果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追风人聊Java

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值