Spring MVC中HandlerInterceptor和HandlerInceptorAdaptor有什么区别?

时间:2016-08-13 18:43:43

标签: java spring spring-mvc

HandlerInterceptorHandlerInterceptorAdaptor都有preHandlepostHandle方法。但我无法理解它们在实施方面有何区别。

3 个答案:

答案 0 :(得分:19)

编程接口而不是实现总是一个好习惯,而Spring Framework通过提供相当多的接口来使用这种做法,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 Framework通常为这些接口提供相应的抽象 Adapter ,例如HandlerInterceptorAdaptor接口HandlerInterceptorWebMvcConfigurerAdapter { {1}}。这些适配器只是这些接口的所有方法的一组默认和简化实现。您可以使用提供的适配器重构前面的代码:

WebMvcConfigurer

由于这些空实现由public class CustomHandlerInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // Some complex logic } } 类提供,因此您只需提供HandlerInterceptorAdapter方法的实现。

正如我所说,这是Spring Framework中反复出现的主题,一些常见的例子是:

答案 1 :(得分:4)

HandlerInterceptorinterface,用于定义执行内容的合同。它有3个需要实现的抽象方法。

即使您只需要拦截afterCompletion,您仍然需要2空方法!

用Spring的说法,"适配器"是abstract class,它为所有方法创建默认的空实现,因此您只需要覆盖所需的实现。注意,这早于Java 8 default方法,这会使这种方法变得多余。

如果您只需要preHandlepostHandle功能,则应使用HandlerInterceptorAdaptor,并且只需要覆盖这两种方法。如果你使用普通的HandlerInterceptor,你仍然需要一个空的方法来编译代码 - 这是不必要的样板。

答案 2 :(得分:0)

由于Java 8为接口方法提供了默认实现的强大功能, 较新版本的spring中的接口不需要 adapter 类即可提供默认的接口实现。

因此,我们可以直接实现接口并仅重写接口中所需的方法,而不必为spring接口扩展相应的适配器类。

例如,如果检查 HandlerInterceptor 接口的声明,则其所有方法的实现都为空,因此不需要适配器cass HandlerInterceptorAdapter