簡體   English   中英

Spring MVC中HandlerInterceptor和HandlerInceptorAdaptor有什么區別?

[英]What is difference between HandlerInterceptor and HandlerInceptorAdaptor in Spring MVC?

HandlerInterceptorHandlerInterceptorAdaptor都有preHandlepostHandle方法。 但我無法理解它們在實施方面有何區別。

編程到接口,而不是實現是一個很好的做法,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 {

    }
}

當您實現更豐富的接口時,這些空實現將導致更大的樣板代碼,例如具有10+抽象方法的WebMvcConfigurer ,想象空方法的負載。

為了解決這個問題,Spring框架通常提供了這些接口的相應的抽象適配器 ,像HandlerInterceptorAdaptorHandlerInterceptor接口或WebMvcConfigurerAdapterWebMvcConfigurer 這些適配器只是這些接口的所有方法的一組默認和簡化實現。 您可以使用提供的適配器重構前面的代碼:

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

由於這些空實現由HandlerInterceptorAdapter類提供,因此您只需要為preHandle方法提供實現。

正如我所說,這是Spring Framework中反復出現的主題,一些常見的例子是:

HandlerInterceptor是一個定義合同的interface 它有3需要實現的抽象方法。

即使你只需要在afterCompletion攔截,你仍然需要2空方法!

在Spring的說法中,“Adapter”是一個abstract class ,它為所有方法創建默認的空實現,因此您只需要覆蓋所需的那些。 注意,這早於Java 8 default方法,這會使這種方法變得多余。

如果您只需要preHandlepostHandle功能,那么您應該使用HandlerInterceptorAdaptor ,您只需要覆蓋這兩個方法。 如果你使用普通的HandlerInterceptor ,你仍然需要一個空方法來編譯代碼 - 這是不必要的樣板。

由於java 8為接口方法提供了一個很好的默認實現功能,因此較新版本的spring中的接口不需要適配器類來提供接口的默認實現。

因此,我們可以直接實現接口並僅從接口覆蓋所需的方法,而不是為spring接口擴展相應的適配器類。

例如,如果你檢查HandlerInterceptor接口的聲明,它的所有方法都有空實現,所以不需要它的適配器cass HandlerInterceptorAdapter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM