springMVCにおけるデザインモード(5)——コンビネーションモード

7910 ワード

springMVCを使用する場合、xmlを使用する方法でもJava注釈を使用する方法でも、多かれ少なかれ構成する必要があると信じています.今日はspringMVCの構成から、重要な設計モデルの一つである組合せモデルについてお話しします.
定義慣例では、まず、組合せモードの定義を見てみましょう.組合せモードは、オブジェクトをツリー構造に組み合わせて「部分-全体」の階層を表し、組合せモードは、ユーザーが単一のオブジェクトと組合せオブジェクトの使用に一貫性を持たせるようにします.一般的には、一連のオブジェクトが1つの全体のオブジェクトに結合され、ユーザがこの組合せオブジェクトを操作するときに1つのオブジェクトを操作するのと同じように使用することができる.
SpringMVCの構成から見ると、Java注釈を使用してspringMVCを構成する場合、通常は次の方法を使用します.
//           WebMvcConfigurerAdapter ,       springMVC   ,  WebMvcConfigurerAdapter WebMvcConfigurer      ,              
public class MyConfiguration extends WebMvcConfigurerAdapter {

       @Override
       public void addFormatters(FormatterRegistry formatterRegistry) {
          formatterRegistry.addConverter(new MyConverter());
       }

       @Override
       public void configureMessageConverters(List converters) {
          converters.add(new MyHttpMessageConverter());
       }

      // More overridden methods ...
  }

では、springMVCはどのようにしてあなたの書き換え方法を探知し、構成の結果をspringMVC自体に伝えますか?ここでは、DelegatingWebMvcConfigurationクラスとEnableWebMvc注釈の2つの重要な部分について説明します.まず簡単なEnableWebMvc注釈から始めましょう.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

EnableWebMvc注釈の最も主要な役割は、DelegatingWebMvcConfigurationというクラスを導入することであることがわかります.そのため、EnableWebMvc注釈を開くと、実際にはDelegatingWebMvcConfigurationというクラスが導入されます.このクラスを見てみましょう.
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

    private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

    //   configure   
    @Autowired(required = false)
    public void setConfigurers(List configurers) {
        if (!CollectionUtils.isEmpty(configurers)) {
            // WebMvcConfigurerComposite    
            this.configurers.addWebMvcConfigurers(configurers);
        }
    }


    @Override
    protected void configurePathMatch(PathMatchConfigurer configurer) {
        this.configurers.configurePathMatch(configurer);
    }

    @Override
    protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        this.configurers.configureContentNegotiation(configurer);
    }

    @Override
    protected void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        this.configurers.configureAsyncSupport(configurer);
    }

    //        。      WebMvcConfigurationSupport 
    //   springMVC  Java      
    //                   
    //         springMVC  ,       。
    // ………………

}

DelegatingWebMvcConfigurationクラスから、Autowired注記によってWebMvcConfigurerクラスのセットが自動的にインポートされることがわかります.ここでは実際にWebMvcConfigurerオブジェクトの検出が完了した.WebMvcConfigurerはインタフェースで、springMVCのJava構成クラスの多くはWebMvcConfigurerAdapterなどに由来しています.したがって、構成クラスはWebMvcConfigurerAdapterクラスを継承し、Configuration注記を追加すると、DelegatingWebMvcConfigurationクラスによって検出され、使用されます.また、このクラスは、WebMvcConfigurerと密接に関連しているプライベートなWebMvcConfigurer Componentオブジェクトを維持していることも見られます.WebMvcConfigurerとともに、モードを組み合わせることで、異なる構成オブジェクトの管理を実現していると言えます.
WebMvcConfigurerComposite
class WebMvcConfigurerComposite implements WebMvcConfigurer {

    private final List delegates = new ArrayList();


    public void addWebMvcConfigurers(List configurers) {
        //     WebMvcConfigurer     delegates
        if (!CollectionUtils.isEmpty(configurers)) {
            this.delegates.addAll(configurers);
        }
    }


    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        for (WebMvcConfigurer delegate : this.delegates) {
            delegate.configurePathMatch(configurer);
        }
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        for (WebMvcConfigurer delegate : this.delegates) {
            delegate.configureContentNegotiation(configurer);
        }
    }

    //         ,  WebMvcConfigurer  

}

WebMvcConfigurerCompositeでは、各メソッドのパラメータのタイプが別のクラスであり、各メソッドがこれらのクラスをWebMvcConfigurerクラスに構成していることがわかります.例えばaddInterceptorsメソッドは、登録されたブロッキングをWebMvcConfigurerに追加し、最終的にWebMvcConfigurationSupportクラスを介してspringMVCに提供する.組合せモードの形式により、springMVCは異なる構成(構成はクラス自体でもある)を同じ全体クラス(すなわちWebMvcConfigurer)に統合した.要するに、springMVCは、ユーザまたはフレームワーク自体が構成されている場合に、WebMvcConfigurerクラスとその派生クラスという全体を操作することによって、組合せモードによって、一言にまとめる.
組み合わせパターンをまとめると理解が非常に簡単で、本章の目的もそれ自体ではなく、springMVCがJava構成をどのように実現するかを全体的に認識することであり、もちろん多くの詳細(例えば最も重要なWebMvcConfigurationSupport)はさらに深く研究する必要がある.springMVCは,フレームワークの全体的な構成と相関サブ構成が本来全体と部分の関係であるため,組合せモードをJava構成の実現に用いることが賢明で合理的であるといえる.我々は日常の開発において,これらの全体‐部分の対応関係も見つかれば,この設計モードを用いて符号量と解結合をうまく簡略化できる.設計モデルを再構築したり、合理的に使用したりできるところを開発で多く考えましょう.