HandlerInterceptor
和HandlerInterceptorAdaptor
都有preHandle
和postHandle
方法。但是我无法理解它们在实现方面有什么区别。
最佳答案
针对接口(interface)而不是实现编程始终是一个好习惯,Spring Framework 通过提供相当多的此类接口(interface)来使用这种做法,HandlerInterceptor
是其中之一。其中一些接口(interface)比其他接口(interface)更丰富。因此,如果您作为客户想要为他们提供自定义实现并且只关心他们的一些方法,那么您最终会得到一些实际的实现和大量空的实现。
例如,假设您要为 preHandle
提供一个实现方法,不关心其他两个。不幸的是,您应该为其他两个提供一些空的实现:
public class CustomHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
// Some complex logic
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}
当你实现更丰富的接口(interface)时,那些空的实现会导致更大的样板代码,比如 WebMvcConfigurer
与 10+
抽象方法,想象一下空方法的负载。
为了解决这个问题,Spring Framework 通常会为那些接口(interface)提供相应的抽象Adapter,比如HandlerInterceptorAdaptor
。对于 HandlerInterceptor
接口(interface)或 WebMvcConfigurerAdapter
对于 WebMvcConfigurer
.这些适配器只是这些接口(interface)的所有方法的一堆默认和简化实现。您可以使用提供的适配器重构前面的代码:
public class CustomHandlerInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
// Some complex logic
}
}
因为那些空的实现是由 HandlerInterceptorAdapter
提供的类,你只需要为 preHandle
提供你的实现方法。
正如我所说,这是 Spring 框架中反复出现的主题,一些常见的示例是:
关于java - Spring MVC 中的 HandlerInterceptor 和 HandlerInceptorAdaptor 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38935873/