目标:webapp工程,監控所有service方法執行時間。
工程:Spring+SpringMVC+MyBatis
AOP使用AspectJ 注解方式。關于Spring AOP總結閱讀:
https://www.jianshu.com/p/41632f76dd62具體實作步驟
1、加入依賴
<!-- aspectj 方式的AOP,需要加入下面三個包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.9</version>
</dependency>
2、開啟AOP
在Spring配置檔案中開啟注解AOP
<aop:aspectj-autoproxy proxy-target-class="true"/>
3、實作切面Aspect
package com.ljheee.tk.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.logging.Level;
import java.util.logging.Logger;
@Aspect
@Component
public class MonitorAop {
private static final Logger logger = Logger.getLogger("MonitorAop");
/**
* 環繞通知
* @param pjp
* @return
* @throws Throwable
*/
@Around("within(com.ljheee.tk.service.*) && execution(public * *(..))")
public Object monitor(ProceedingJoinPoint pjp) throws Throwable {//ProceedingJoinPoint:用于環繞通知
String targetClassName = pjp.getTarget().getClass().getSimpleName();
String methodName = pjp.getSignature().getName();
String methodFullName = targetClassName + "." + methodName;
Object[] args = pjp.getArgs();// 方法參數
Object result = null;
try {
logger.setLevel(Level.INFO);
logger.info("methodFullName=" + methodFullName);
long begin = System.currentTimeMillis();
result = pjp.proceed();
long delay = System.currentTimeMillis() - begin;
logger.info("delay=" + delay);
} catch (Exception e) {
e.printStackTrace();
} finally {
logger.info("methodFullName=" + methodFullName + ",result=" + result);
}
return result;
}
}
完整工程:
https://github.com/ljheee/my-monitor-aop代碼性能測試
還可以利用PerformanceMonitorInterceptor/JamonPerformanceMonitorInterceptor來協助應用性能優化, 這是spring自帶的。
但是它倆隻是列印了是大量的原始資料日志,不幸的是這些東西對我們幾乎沒用,每一個方法調用都會有記錄,而且缺乏一些其他資訊。是以,除非你打算寫一些日志分析程式、或者使用第三方軟體,否則的話,我想你應該在日志被記錄前做出一些處理。
https://my.oschina.net/jack230230/blog/65987