package com.cp.common.aop;
import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TimeHandler
implements MethodInterceptor
{
private static final Log log = LogFactory.getLog(TimeHandler.class);
private int error;
private int warn;
private int info;
public TimeHandler()
{
this.error = 200;
this.warn = 100;
this.info = 50;
}
public Object invoke(MethodInvocation methodInvocation)
throws Throwable
{
long procTime = System.currentTimeMillis();
try {
Object result = methodInvocation.proceed();
return result;
}
finally {
procTime = System.currentTimeMillis() - procTime;
String msg = "Process method " + methodInvocation.getMethod().getName() + " successful! Total time: " + procTime + " milliseconds!";
if (procTime > this.error)
if (log.isErrorEnabled()) log.error(msg);
else if (procTime > this.warn)
if (log.isWarnEnabled()) log.warn(msg);
else if (procTime > this.info)
if (log.isInfoEnabled()) log.info(msg);
else if (log.isDebugEnabled()) log.debug(msg);
}
}
public void setError(int error)
{
this.error = error;
}
public void setWarn(int warn)
{
this.warn = warn;
}
public void setInfo(int info)
{
this.info = info;
}
}
/*
對于上面的代碼需要說明的是下面兩行代碼:
Object result = methodInvocation.proceed();
return result;
整個程序的流程是這樣的:
1,先是執行在Object result = methodInvocation.proceed();前面的代碼;
2,接著執行Object result = methodInvocation.proceed();,它把執行控制權交給了interceptor stack(攔截器棧)內的下一個interceptor,如果沒有了就交給真正的業務方法;
3,然后執行return result;之前的代碼;
4,最后執行return result;,它把控制權交回它之上的interceptor,如果沒有了就退出interceptor stack。
*/