2016-08-13 25 views

答えて

11

のインターフェイスではなく、インターフェイスにプログラムすることをお勧めします。そして、Spring Frameworkはこれらのインターフェイスをかなり提供することでこのプラクティスを使用します。HandlerInterceptorがその1つです。これらのインタフェースの中には、他のものより豊かなものもあります。したがって、クライアントとしてカスタム実装を提供し、それらのメソッドのうちのほんの一部だけを気にしたい場合は、いくつかの実際の実装と多くの空の実装に終わるでしょう。

たとえば、preHandleメソッドの実装を提供し、他の2つについては気にしないとします。あなたも、よりリッチなインターフェースを実装しているときに、これらの空の実装が空のメソッドの負荷を想像し、10+抽象メソッドとWebMvcConfigurerのように、より大きな定型コードを引き起こす

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 { 

    } 
} 

:残念ながら、あなたは他の二つのためのいくつかの空の実装を提供する必要があります。

この問題を解決するために、スプリングフレームワークは、通常、HandlerInterceptorインターフェイスまたはWebMvcConfigurerためWebMvcConfigurerAdapterためHandlerInterceptorAdaptorように、これらのインタフェースのために対応する抽象アダプタを提供します。これらのアダプタは、これらのインタフェースのすべてのメソッドのデフォルトおよび単純化された実装の群に過ぎません。あなたは提供アダプターを使用して上記のコードをリファクタリングすることができます

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

これらの空の実装がHandlerInterceptorAdapterクラスで提供されているので、あなただけのpreHandleメソッドの実装を提供する必要があります。

私が言ったように、これは春Frameworkで繰り返されるテーマである、一般的な例のいくつかは、次のとおりです。

3

HandlerInterceptorは、スタッフの契約を定義するinterfaceです。実装する必要がある抽象メソッドは3です。

afterCompletionを傍受する必要がある場合でも、依然として2の空のメソッドが必要です。

"Adapter"はabstract classで、すべてのメソッドに対してデフォルトの空の実装を作成するので、必要なものを上書きするだけで済みます。これは、Java 8 defaultメソッドの前に、これを冗長にする方法に注意してください。

preHandlepostHandleの機能が必要な場合は、HandlerInterceptorAdaptorを使用する必要があります。これら2つの方法をオーバーライドするだけで済みます。普通のHandlerInterceptorを使用する場合は、コードをコンパイルするために空の方法が1つ必要です。これは不要な定型文です。

関連する問題