package com.paic.phucp.console.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 将执行时间记录日志
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogMethodRuntime {
}
package com.paic.phucp.console.aop;
import com.paic.phucp.console.annotations.LogMethodRuntime;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 对于需要监控执行时间的方法,打印方法耗时日志。
*/
@Aspect
@Component
@Slf4j
public class LogMethodRuntimeAop {
/**
* 定义切面
*/
@Pointcut("@annotation(com.paic.phucp.console.annotations.LogMethodRuntime)")
public void doLogMethodRuntime() {
//Do nothing because of defining a pointcut.
}
/**
* 切面程序
*/
@Around("doLogMethodRuntime()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object retVal = null;
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
/* 获取当前类 */
Class<?> clazz = pjp.getTarget().getClass();
/* 获取方法签名 */
String methodName = methodSignature.getName();
/* 获取入参 */
Class<?>[] params = ((MethodSignature) pjp.getSignature()).getParameterTypes();
Method method = clazz.getMethod(methodName, params);
LogMethodRuntime logMethodRuntime = null;
if (method.isAnnotationPresent(LogMethodRuntime.class)) {
logMethodRuntime = method.getAnnotation(LogMethodRuntime.class);
}
if (null == logMethodRuntime) {
return pjp.proceed();
}
/* 获取类名 */
String clazzName = clazz.getSimpleName();
/* 当前线程id */
Long currentThreadId = Thread.currentThread().getId();
StringBuilder sb = new StringBuilder();
sb.append("=LogMethodRuntime=");
sb.append(clazzName);
sb.append('.');
sb.append(methodName);
sb.append('(');
sb.append(currentThreadId);
sb.append(") is to start.");
log.info(sb.toString());
/* 计算方法运行时间 */
Long startTime = System.currentTimeMillis();
retVal = pjp.proceed();
Long endTime = System.currentTimeMillis();
sb = new StringBuilder();
sb.append("=LogMethodRuntime,end=");
sb.append(clazzName);
sb.append('.');
sb.append(methodName);
sb.append('(');
sb.append(currentThreadId);
sb.append("),takes ");
sb.append(endTime - startTime);
sb.append("ms.");
log.info(sb.toString());
return retVal;
}
}