58

拡張時のgetServletConfigClasses()vs の違いは何ですか。今朝から多くの情報源を読んでいますが、違いについてはまだ明確に理解していません:getRootConfigClasses()AbstractAnnotationConfigDispatcherServletInitializer

次の 2 つの構成をご覧ください。

1)。

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {         
        return new Class[] { ConServlet.class }; 
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {                      
        return null;
    }
        ....
        ....    
        }

ConServlet.class

@EnableWebMvc 
@Configuration
@ComponentScan({ "com" })
@Import({ SecurityConfig.class })
public class ConServlet {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }   
}

2)。

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class }; 
    }
    .....
}

WebConfig.classが参照している

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "....." })
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Bean
    public ViewResolver viewResolver() {

        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

ビューの初期化など、 ConServletWebConfigの両方が (多かれ少なかれ) 同じことを行っていることがわかります。

しかし、なぜ :

  • ConServletが返されますgetRootConfigClasses()
  • WebConfigが返される間getServletConfigClasses()

ドキュメントを読みました

getRootConfigClasses()getServletConfigClasses( )の両方 が

提供される @Configuration および/または @Component クラスを指定します.. (それらの違い)

  • ルート アプリケーション コンテキストgetRootConfigClasses()
  • のディスパッチャ サーブレット アプリケーション コンテキスト getServletConfigClasses()

しかし、なぜConServletWebConfig が同じこと (ビューの初期化など) を行っているのでしょうか。簡単な用語/例で実際にルートコンテキストとディスパッチャーサーブレット(私はこれを知っています)とは何ですか

ありがとうございました!

4

2 に答える 2

7

ルート構成クラスは、アプリケーション固有の Bean を作成するために実際に使用され、フィルターで使用できるようにする必要があります (フィルターはサーブレットの一部ではないため)。

サーブレット構成クラスは、ViewResolvers、ArgumentResolvers、Interceptor などの DispatcherServlet 固有の Bean を作成するために実際に使用されます。

最初にルート構成クラスがロードされ、次にサーブレット構成クラスがロードされます。

ルート構成クラスは親コンテキストになり、インスタンスを作成しApplicationContextます。サーブレット構成クラスは親コンテキストの子コンテキストになり、WebApplicationContextインスタンスを作成します。

構成では、でのみ必要なため、 と BeanをConServlet指定する必要はありません。@EnableWebMvcInternalResourceViewResolverWebConfig

于 2016-02-16T08:46:54.530 に答える