注意:proxy-target-class="true" 这是决定是走jdk代理还是spring cglib代理的。高版本的(貌似)可以忽略。
1.在spring 相关配置文件中假如如下配置:
<!-- 日志时间打印 -->
<aop:config proxy-target-class="true">
<!-- 这里拦截 service 包中的所有方法 -->
<aop:advisor id="methodTimeLog" advice-ref="methodTimeAdvice" pointcut="execution(* *..service..*(..))"/>
</aop:config>
<bean id="methodTimeAdvice" class="com.ra.fire.utils.MethodTimeAdvice">
</bean>
2.实现spring aopalliance-1.0.jar 包中的的 MethodInterceptor 接口,实现类如下:
package com.ra.fire.utils;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.StopWatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MethodTimeAdvice implements MethodInterceptor {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 拦截要执行的目标方法
*/
public Object invoke(MethodInvocation invocation) throws Throwable {
//用 commons-lang 提供的 StopWatch 计时,Spring 也提供了一个 StopWatch
StopWatch clock = new StopWatch();
clock.start(); //计时开始
Object result = invocation.proceed();
clock.stop(); //计时结束
//方法参数类型,转换成简单类型
Class[] params = invocation.getMethod().getParameterTypes();
String[] simpleParams = new String[params.length];
for (int i = 0; i < params.length; i++) {
simpleParams[i] = params[i].getSimpleName();
}
if(clock.getTime()>=200){
logger.info("====Methods execute time:" + clock.getTime() + " ms ["
+ invocation.getThis().getClass().getName() + "."
+ invocation.getMethod().getName() + "("+StringUtils.join(simpleParams,",")+")] ");
}
return result;
}
}
来源:oschina
链接:https://my.oschina.net/u/2831993/blog/3002227