在春季MVC中,HandlerInterceptor和HandlerInceptorAdaptor有什么区别?

2022-09-03 08:57:45

两者兼而有之和方法。但是,我无法理解它们在执行方面有什么区别。HandlerInterceptorHandlerInterceptorAdaptorpreHandlepostHandle


答案 1

编程到接口总是一个很好的做法,而不是实现,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 {

    }
}

当您实现更丰富的接口时,这些空实现将导致更大的样板代码,例如抽象方法,想象一下空方法的负载。WebMvcConfigurer10+

为了解决这个问题,Spring框架通常为这些接口提供相应的抽象适配器,如接口或.这些适配器只是这些接口的所有方法的一堆默认和简化的实现。您可以使用提供的适配器重构上述代码:HandlerInterceptorAdaptorHandlerInterceptorWebMvcConfigurerAdapterWebMvcConfigurer

public class CustomHandlerInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        // Some complex logic
    }
}

由于这些空实现是由类提供的,因此您只需要为方法提供实现。HandlerInterceptorAdapterpreHandle

正如我所说,这是春季框架中反复出现的主题,一些常见的例子是:


答案 2

HandlerInterceptor是一个定义做事合同的合同。它具有需要实现的抽象方法。interface3

即使你只需要拦截,你仍然需要空的方法!afterCompletion2

在Spring的说法中,“Adapter”是为所有方法创建默认空实现的,因此您只需要重写所需的方法。请注意,这早于 Java 8 方法,该方法将使此变得多余。abstract classdefault

如果您只需要和功能,那么您应该使用并且只需要重写这两种方法。如果你使用 plain ,你仍然需要一个空方法来编译代码 - 这是不必要的样板。preHandlepostHandleHandlerInterceptorAdaptorHandlerInterceptor


推荐