Spring框架中识别和调用拦截器(Interceptor)和异常处理器(HandlerExceptionResolver)是通过容器内部的组件扫描和自动装配机制来完成的。
拦截器(Interceptor):
Spring MVC 的拦截器必须实现 HandlerInterceptor 接口。你可以定义一个拦截器类,然后将其注册为Spring的Bean。
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 在请求处理之前进行调用return true; // 如果返回false,则停止流程,api不会被调用}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 请求处理之后进行调用,但是在视图被渲染之前}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 在整个请求结束之后调用,也就是在DispatcherServlet渲染了视图执行}
}
然后在Spring配置中注册这个拦截器:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor());}
}
异常处理器(HandlerExceptionResolver)
:
异常处理器可以通过实现 HandlerExceptionResolver 接口来创建
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Order(value=1)
public class MyHandlerExceptionResolver implements HandlerExceptionResolver, Ordered {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 在这里处理异常,创建一个包含错误信息的ModelAndViewreturn new ModelAndView("error");}@Overridepublic int getOrder() {return 1;}
}
Spring会自动扫描标注了@Component的类,如果这个类实现了HandlerExceptionResolver接口,那么它会被注册为异常处理器。
或者,你也可以在配置类中显式注册异常处理器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class WebConfig {@Beanpublic HandlerExceptionResolver handlerExceptionResolver() {return new MyHandlerExceptionResolver();}
}
以上代码展示了如何定义和注册Spring MVC的拦截器和异常处理器。Spring会在启动时自动发现并应用这些配置。