在春季MVC中,HandlerInterceptor和HandlerInceptorAdaptor有什么区别?
两者兼而有之和方法。但是,我无法理解它们在执行方面有什么区别。HandlerInterceptor
HandlerInterceptorAdaptor
preHandle
postHandle
两者兼而有之和方法。但是,我无法理解它们在执行方面有什么区别。HandlerInterceptor
HandlerInterceptorAdaptor
preHandle
postHandle
编程到接口总是一个很好的做法,而不是实现,Spring框架通过提供相当多的这些接口来使用这种做法,就是其中之一。其中一些接口比其他接口更丰富。因此,如果您作为客户端想要为他们提供自定义实现,并且只关心他们的几个方法,那么您最终会得到一些实际的实现和许多空的实现。HandlerInterceptor
例如,假设您要为方法提供一个实现,而不关心其他两个。不幸的是,您应该为其他两个提供一些空实现: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 {
}
}
当您实现更丰富的接口时,这些空实现将导致更大的样板代码,例如抽象方法,想象一下空方法的负载。WebMvcConfigurer
10+
为了解决这个问题,Spring框架通常为这些接口提供相应的抽象适配器,如接口或.这些适配器只是这些接口的所有方法的一堆默认和简化的实现。您可以使用提供的适配器重构上述代码:HandlerInterceptorAdaptor
HandlerInterceptor
WebMvcConfigurerAdapter
WebMvcConfigurer
public class CustomHandlerInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
// Some complex logic
}
}
由于这些空实现是由类提供的,因此您只需要为方法提供实现。HandlerInterceptorAdapter
preHandle
正如我所说,这是春季框架中反复出现的主题,一些常见的例子是:
HandlerInterceptor
是一个定义做事合同的合同。它具有需要实现的抽象方法。interface
3
即使你只需要拦截,你仍然需要空的方法!afterCompletion
2
在Spring的说法中,“Adapter”是为所有方法创建默认空实现的,因此您只需要重写所需的方法。请注意,这早于 Java 8 方法,该方法将使此变得多余。abstract class
default
如果您只需要和功能,那么您应该使用并且只需要重写这两种方法。如果你使用 plain ,你仍然需要一个空方法来编译代码 - 这是不必要的样板。preHandle
postHandle
HandlerInterceptorAdaptor
HandlerInterceptor