web-dev-qa-db-ja.com

ルートコンテキストとディスパッチャーサーブレットコンテキストは、Spring MVC Webアプリケーションにどの程度正確に反映されますか?

私は勉強していますSpring MVCと私は関連するいくつかの疑問を持っています

したがって、ユーザーの要求を処理するDispatcherServletを構成するこの構成クラスがあります。

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {

        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = ...
        // Create the dispatcher servlet's Spring application context
        AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();

       dispatcherContext.register(DispatcherConfig.class);

       // Register and map the dispatcher servlet
       ServletRegistration.Dynamic dispatcher = container.addServlet("main", new DispatcherServlet(dispatcherContext));
       dispatcher.setLoadOnStartup(1);
       dispatcher.addMapping("main/");
   }
}

DispatcherServletがどのように機能するかは、私にはかなり明らかです。私の疑問はcontextコンセプトに関連しています。

1)contextを正確に表すものは何ですか?それは、特定の目的を持った豆のセットのようなもので、環境に合わせて機能するものだと思います。しかし、私はこの主張については絶対に真実ではありません。

2)ルートコンテキストディスパッチャーサーブレットコンテキストの違いは何ですか?

3)dispatcherContextで定義されているBeanが私が理解していることから、rootContextで定義されているBeanにアクセスできます(ただし、その逆は当てはまりません)。どうして?

Tnx

23
AndreaNobili

ルートコンテキスト

Springアプリケーションのルートコンテキストは、ApplicationContextによってロードされるContextLoaderListenerです。このコンテキストには、サービス、リポジトリ、インフラストラクチャBean(DataSourceEntityManagerFactorysなど)などのグローバルに利用可能なリソースが必要です。

ContextLoaderListenerは、このコンテキストをServletContextorg.springframework.web.context.WebApplicationContext.ROOTという名前で登録します。

ApplicationContextを自分でロードし、それを上記の名前でServletContextに登録すると、ルートコンテキストとして機能します。

子コンテキスト

Springアプリケーションの子コンテキストは、ApplicationContextによって読み込まれるDispatcherServletです(たとえば、Spring-WSアプリケーションのMessageDispatcherServlet)。このコンテキストには、ViewResolvers、HandlerMappingsなどのSpring MVCの場合、そのコンテキストに関連するBeanのみを含める必要があります。

サーブレットは、このコンテキストをServletContextorg.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name>という名前で登録します。

ルート<-子関係

複数の子コンテキストを作成できるため、親コンテキストにアクセスできるのは子コンテキストのみです。たとえば、Spring WSアプリケーションと組み合わせたSpring MVCで。親コンテキストは、よく知られている名前のServletContextで見つけることにより、子供によって検出されます。

ルートコンテキストが子にアクセスできる場合、Beanをワイヤリングするためにどのコンテキストを使用しますか?その隣にある場合は、AOPが関係しているときにも驚くべき結果が得られます。子コンテキストで定義されたAOPは、ルートコンテキストで構成されたBeanに突然影響します。

32
M. Deinum