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

标签 java spring spring-mvc

HandlerInterceptorHandlerInterceptorAdaptor 都有preHandlepostHandle 方法。但是我无法理解它们在实现方面有什么区别。

最佳答案

针对接口(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)时,那些空的实现会导致更大的样板代码,比如 WebMvcConfigurer10+抽象方法,想象一下空方法的负载。

为了解决这个问题,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/

相关文章:

java - 在 Java 中加载 DSA 公钥

java - 控制打印页面上面板的大小

java - fatal error - 序言中不允许内容

java - 单个 hibernate session 中的多个事务(使用 Spring)

Heroku 上的 Spring Boot - Web 进程在启动后 90 秒内无法绑定(bind)到 $PORT

java - 更新 Gradle 项目库

java - Spring项目无法连接数据库

java - map 的大小限制为 3 个元素

java - @ModelAttribute在Spring框架中如何工作?

java - Eclipse OSGi 包需要另一个包的片段