前言
SpringMVC经常需要使用或编写一些拦截器,本文是SpringMVC的bean加载和使用过程中使用的全局拦截器的一些说明。
不限于Filter、Interceptor、AOP等。本文的“拦截”是泛概念,表示能加载或拦截类或者方法后执行某些逻辑的方式。
整体说明
下面是初始化实例、bean被调用时可以“拦截”的一些关键点说明,按照大致的顺序如下:
初始化类
初始化类时,可以拦截后执行逻辑的方法:
- @postConstruct注解
- 实现接口InitializingBean的afterPropertiesSet方法
- @Bean注解类后的init-method方法指定
调用bean
包括Filter、Interceptor(HandlerInterceptor、MethodInterceptor如后面的AOP)、RequestBodyAdvice/ResponseBodyAdvice、AOP(@Aspect)等。可以通过自定义类实现上面的接口或提供AOP拦截,大致顺序:
- Filter接口的doFilter开始
- HandlerInterceptor接口的preHandle方法
- RequestBodyAdvice接口的beforeBodyRead方法
- @Aspect注解类的@Around注解方法开始
- @Aspect注解类的@Before
- @Aspect注解类的@AfterReturning
- @Aspect注解类的@After
- @Aspect注解类的@Around结束
- HandlerInterceptor注解类的postHandle方法
- HandlerInterceptor注解类的afterCompletion方法
- Filter接口的doFilter结束
异常时的流程参考上图。
异常拦截
controller异常时也可用全局异常来拦截,定义方法或类
- Controller类直接用注解@ExceptionHandler的方法来拦截
- 单独注解@ControllerAdvice类+注解@ExceptionHandler的方法
- 实现HandlerExceptionResolver接口的resolveException方法
最后
待持续更新