AOP計算方法執行時長
阿新 • • 發佈:2020-08-18
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