1. 程式人生 > 實用技巧 >AOP計算方法執行時長

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