为了分析系统的性能问题需要把DAO和Service层的执行时间打到log里。 想用Spring aop实现,居然花费了不少时间,网上的帖子写的眼花缭乱,官网文档改版后也没以前好看(根本就没找到),所以还是自己记录一下方便以后重用。
1. Aspect类。
简单的object就可以,不需要实现某接口或继承某父类。
package com.app.web.common;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
public class PerformanceLogAspect
{
private static Logger logger = LogManager.getLogger(PerformanceLogAspect.class);
public Object around (ProceedingJoinPoint joinPoint) throws Throwable {
long st = System.currentTimeMillis();
try
{
return joinPoint.proceed();
} finally
{
long elapse = System.currentTimeMillis() - st;
logger.debug("{}.{}() elapsed: {}",
joinPoint.getTarget().getClass().getName(),
joinPoint.getSignature().getName(),
elapse);
}
}
}
2. spring.xml文件中配置
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="performanceAspect" class="com.app.web.common.PerformanceLogAspect"></bean>
<aop:config>
<aop:aspect id="logAspect" ref="performanceAspect">
<aop:pointcut id="log" expression="execution(public * com.app.web.rest..*Service.*(..)) or execution(public * com.app.web.rest..*Dao.*(..))"/>
<!-- 方法前触发 <aop:before pointcut-ref="log" method="before"/> -->
<!-- 方法后触发 <aop:after pointcut-ref="log" method="after"/> -->
<!-- 环绕触发 --><aop:around pointcut-ref="log" method="around"/>
</aop:aspect>
</aop:config>
简单到无语。。。