1.Filter
无法知道被调用的对象的情报(类,方法,参数)
@Component //也可以通过@Configuration,@Bean进行注册
public class TimeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("####TimeFilter:time filter init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("####TimeFilter:time filter start");
long start = new Date().getTime();
chain.doFilter(request,response);
System.out.println("####TimeFilter:time filter"+(new Date().getTime()-start));
System.out.println("####TimeFilter:time filter finish");
}
@Override
public void destroy() {
System.out.println("####TimeFilter:time filter destroy");
}
}
@Configuration
public class WebConfig {
// 正常Filter类有@Component就会被自动注册给Spring了,如果是第三方提供的类,没有@Component,可以用以下方法注册
@Bean
public FilterRegistrationBean timeFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
TimerFilter timerFilter = new TimerFilter();
registrationBean.setFilter(timerFilter);
List<String> urls = new ArrayList<>();
urls.add("/*");
registrationBean.setUrlPatterns(urls);
return registrationBean;
}
}
2.Interceptor
@Component//还需要在@Configuration(implements WebMvcConfigurer)类中覆盖addInterceptors方法,注册这个拦截器
public class TimeInterceptor implements HandlerInterceptor {
@Override//Controller方法调用前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("****TimeInterceptor:preHandle");
System.out.println("****TimeInterceptor:"+((HandlerMethod)handler).getBean().getClass().getName());
System.out.println("****TimeInterceptor:"+((HandlerMethod)handler).getMethod().getName());
//在filter中一个方法完成逻辑的,拦截器中是两个方法 只能用request来存储数据
request.setAttribute("startTime",new Date().getTime());
return true;//决定后面是否要执行 Controller中的方法
}
@Override//Controller方法处理后调用 Controller方法抛出异常就不会调用了
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("****TimeInterceptor:postHandle");
long start = (long) request.getAttribute("startTime");
System.out.println("****TimeInterceptor:time interceptor 耗时:"+(new Date().getTime()-start));
}
@Override//不管抛出异常没有 都会执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("****TimeInterceptor:afterCompletion");
System.out.println("****TimeInterceptor:"+((HandlerMethod)handler).getBean().getClass().getName());
System.out.println("****TimeInterceptor:"+((HandlerMethod)handler).getMethod().getName());
long start = (long) request.getAttribute("startTime");
System.out.println("****TimeInterceptor:time interceptor 耗时:"+(new Date().getTime()-start));
System.out.println("****TimeInterceptor:ex is "+ex);
}
}
3.Aspect
@Aspect
@Component
public class TimeAspect {
@Around("execution(* jp..*.controller.*.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("%%%%TimeAspect:time aspect start");
String targetName = proceedingJoinPoint.getTarget().getClass().getName();
System.out.println("%%%%TimeAspect:targetName "+targetName);
Object[] args = proceedingJoinPoint.getArgs();
for (Object arg : args) {
System.out.println("%%%%TimeAspect:"+arg.getClass().getName());
System.out.println("%%%%TimeAspect:arg is " + arg);
}
long startTime = new Date().getTime();
Object obj = proceedingJoinPoint.proceed();
System.out.println("%%%%TimeAspect:time aspect 耗时" + (new Date().getTime() - startTime));
System.out.println("%%%%TimeAspect:time aspect end");
return obj;
}
}
关于@Around execution
@Around("execution(* jp..*.controller.*.*(..))") 1.格式为包名.类名.方法名 2. [..*]:匹配包名中任意多层任意名称的包
网友评论