根上下文和调度程序servlet上下文到底是如何进入Spring MVC Web应用程序的?

时间:2015-06-04 09:18:27

标签: java spring spring-mvc java-ee servlets

我正在学习 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 的工作原理。我的怀疑与上下文概念有关。

1)究竟代表上下文的是什么?我认为这类似于一组具有特定pourpose并且可以在环境中工作的bean。但我绝对不是这个断言的真实。

2)根上下文调度程序servlet上下文之间有什么区别?

3)根据我的理解, dispatcherContext 中定义的bean可以访问 rootContext 中定义的bean(但相反的情况并非如此)。为什么呢?

TNX

1 个答案:

答案 0 :(得分:27)

根上下文

Spring应用程序中的根上下文是由ApplicationContext加载的ContextLoaderListener。此上下文应具有全局可用资源,如服务,存储库,基础架构bean(DataSourceEntityManagerFactory等)等。

ContextLoaderListener在名称ServletContext下的org.springframework.web.context.WebApplicationContext.ROOT中注册此上下文。

如果你自己加载ApplicationContext并在ServletContext中使用上面的名称注册它,那么它就有资格作为根上下文。

子上下文

Spring应用程序中的子上下文是由ApplicationContext(或者例如Spring-WS应用程序中的DispatcherServlet)加载的MessageDispatcherServlet。对于Spring MVC,此上下文应该只包含与该上下文相关的bean,ViewResolver s,HandlerMapping等。

servlet在名称ServletContext下的org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name>中注册此上下文。

Root&lt; -Child Relation

只有子上下文才能访问父上下文,因为您可以拥有多个子上下文。例如,在Spring MVC中结合Spring WS应用程序。子项通过在ServletContext中使用众所周知的名称查找它来检测父上下文。

如果根上下文可以访问哪个孩子将用于连接bean?接下来如果是这样的话,当涉及AOP时你也会得到令人惊讶的结果。子上下文中定义的AOP会突然影响根上下文中配置的bean。