AOP计算方法执行时长

AOP计算方法执行时长

依赖引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

注意:在完成了引入AOP依赖包后,不需要去做其他配置。AOP的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy,不需要在程序主类中增加@EnableAspectJAutoProxy来启用。

如果需要关闭,在 application.properties 中加入配置

spring.aop.auto=false

切面编写

package com.cc.analysis;

//AOP切面 :多个切面时,@Order(i)注解来标识切面的优先级。i的值越小,优先级越高
@Aspect
@Slf4j
@Component
public class ExeTimeAspect {

    @Pointcut("execution(public * com.cc.analysis.controller.AnalysisController.*(..))")
    public void logTime(){}

    //统计请求的处理时间
    ThreadLocal<Long> startTime = new ThreadLocal<>();

    @Before("logTime()")
    public void doBefore(JoinPoint joinPoint) throws Throwable{
        startTime.set(System.currentTimeMillis());
        //接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //记录请求的内容
        log.info("Aspect_URL:"+request.getRequestURL().toString());
        log.info("Aspect_Method:"+request.getMethod());
    }

    @AfterReturning(returning = "ret" , pointcut = "logTime()")
    public void doAfterReturning(Object ret){
        //处理完请求后,返回内容
        log.info("方法返回值:"+ JSON.toJSONString(ret));
        log.info(String.format("方法执行时间: %d 毫秒", System.currentTimeMillis() - startTime.get()));
    }
}

controller方法执行

@GetMapping("test")
public int test() {
    return 1;
}

执行结果

2020-07-27 12:36:00.088  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : Aspect_URL:http://localhost:9090/test
2020-07-27 12:36:00.089  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : Aspect_Method:GET
2020-07-27 12:36:00.093  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : 方法返回值:1
2020-07-27 12:36:00.093  INFO 7457 --- [nio-9090-exec-2] c.c.analysis.ExeTimeAspect    : 方法执行时间: 5 毫秒

疑问

springboot的启动类和AOP的配置类(ExeTimeAspect)需要在同一级目录下,才能够扫描到controller里的方法,执行AOP的效果。如果AOP的配置类(ExeTimeAspect)在子目录则无法执行。

尝试在启动类增加注解 @ComponentScan("com.cc.analysis.*") 也没能解决问题

成功执行目录

|____com
| |____cc
| | |____analysis
| | | |____App.java*
| | | |____ExeTimeAspect.java*
| | | |____controller
| | | | |____AnalysisController.java

失败目录

|____com
| |____cc
| | |____analysis
| | | |____App.java*
| | | |____config
| | | | |____ExeTimeAspect.java*
| | | |____controller
| | | | |____AnalysisController.java
原文地址:https://www.cnblogs.com/renzhuo/p/13522835.html