第二步:自定义MyLog注解
注解上的两个注解方法作用:
@Target(ElementType.METHOD) //这个注解加在方法上,通过ElementType的枚举指定这个注解加在什么位置
@Retention(RetentionPolicy.RUNTIME) //这个注解运行时生效
————————————————
```package com.laoyang.log;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
自定义日志注解
*/
@Target(ElementType.METHOD) //这个注解加在方法上,通过ElementType的枚举指定这个注解加在什么位置
@Retention(RetentionPolicy.RUNTIME) //这个注解运行时生效
public @interface MyLog {/**
- 方法描述
*/
String desc() default "";
}第三步:自定义日志拦截器MyLogInterceptor,用来计算加了MyLog注解后的方法从开始到结束总共的运行时间。 、
package com.laoyang.log;
- 方法描述
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
- @author:Kevin
- @create: 2022-09-17 10:41
- @Description: 自定义拦截器
*/
public class MylogInterceptor extends HandlerInterceptorAdapter {
private static final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
/**
* controller方法执行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod)handler; //转换成方法处理器
Method method = handlerMethod.getMethod(); //获得被拦截的方法对象
MyLog annotation = method.getAnnotation(MyLog.class); //获得方法上的MyLog注解
if (annotation != null){
//说明当前拦截的方法加入了MyLog注解
long currentTimeMills = System.currentTimeMillis();
startTimeThreadLocal.set(currentTimeMills);
}
return true;
}
/**
* controller方法执行之后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod)handler; //转换成方法处理器
Method method = handlerMethod.getMethod(); //获得被拦截的方法对象
MyLog annotation = method.getAnnotation(MyLog.class); //获得方法上的MyLog注解
if (annotation!=null){
//说明当前拦截的方法加入了MyLog注解
long endTime = System.currentTimeMillis();
Long startTime = startTimeThreadLocal.get();
long optTime = endTime - startTime; //计算controller方法执行时间
String requestUri = request.getRequestURI(); //获取当前请求的地址
String methodName = method.getDeclaringClass().getName() + "." +
method.getName(); //获取当前请求的方法名称
String methodDesc = annotation.desc(); //获取注解的声明
System.out.println("请求uri:" + requestUri);
System.out.println("请求方法名:" + methodName);
System.out.println("方法描述:" + methodDesc);
System.out.println("方法执行时间:" + optTime + "ms");
}
super.postHandle(request, response, handler, modelAndView);
}
}
```