目标: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