当前位置: 首页 > 知识库问答 >
问题:

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

孙阳舒
2023-03-14

我正在学习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/");
   }
}

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

TNX

共有1个答案

邢浩邈
2023-03-14

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

ContextLoaderListenerServletContext中以org.springframework.web.context.WebApplicationContext.root的名称注册此上下文。

如果您自己加载一个ApplicationContext并在ServletContext中用上面的名称注册它,那么它将被限定为根上下文。

Spring应用程序中的子上下文是ApplicationContext,它由DispatcherServlet(或者例如Spring-WS应用程序中的MessageDispatcherServlet)加载。对于Spring MVC来说,这个上下文应该只包含与该上下文相关的bean,这些bean将是ViewResolverHandlerMapping等。

servlet在servletContext中以org.springframework.web.servlet.frameworkservlet.context. 的名称注册这个上下文。

只有子上下文可以访问父上下文,因为您可能有多个子上下文。例如,在Spring MVC和Spring WS应用程序组合中。父上下文由子上下文检测,方法是在ServletContext中找到具有已知名称的父上下文。

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

 类似资料:
  • 问题内容: 我正在研究 Spring MVC ,所以我有一些疑问 因此,我有这个配置类,用于配置处理用户请求的 DispatcherServlet : 我很清楚 DispatcherServlet的 工作方式。我的怀疑与 上下文 概念有关。 1)确切表示 上下文 ?我认为这就像一组具有特定用途的豆类,可以在环境中工作。但是我绝对不正确。 2) 根上下文 和 调度程序servlet上下文有 什么区别

  • 我知道我需要在servlet上下文中注册用注释的类,以使webapp可访问。通常,我会按照以下方式来做: 我添加到根应用程序上下文中的所有其他配置类。下面是我的dispatcher初始值设定项通常的样子: 但是当我开始使用WebSockets时,事情变得更有趣了。要使websockets工作,必须将WebSoketConfig.class放到servlet上下文中。下面是我的WebSocketCo

  • 问题内容: 我已经使用和上下文init-parameter 配置了根应用程序上下文。 然后,JSF(* .jsf)变量解析器访问根上下文。它工作正常。 现在的问题是,经过的请求将获得另一个应用程序上下文,然后将单例bean实例化两次。 我不需要其他的应用程序上下文,如何指定它来重用由加载的现有根应用程序上下文? 注意 阅读答案中的参考页后,我知道根上下文和调度程序上下文之间存在上下文分隔,但是没有

  • 让spring boot 1.3.x应用程序在application.properties中定义server.context-path=/myPath,并按照Java spring boot中定义重定向请求:如何将我的应用程序根(“/”)映射到index.html? 使用viewControllerRegistry.addViewController(“/”).setViewName(“forwa

  • 同时,Puppy资源将更多地位于webMvc级别,并加载到DispatcherServlet的上下文中。 从我刚才读到的内容(现在我很有希望理解)来看,根上下文实际上是DispatcherServlet创建的上下文的‘父’上下文。这意味着根上下文中的bean实际上可以自动连接/注入到DispatcherServlet创建的上下文中的任何bean中。我只是了解了“嵌套”上下文的概念。这准确吗? 如果

  • 问题内容: 我想让我的JAX-RX应用程序从根上下文开始,所以我的URL是 http://example.com/restfullPath 并不是 http://example.com/rest/restfullPath 我从这里切换了我的应用程序的注释 对此 但随后看来,它接管了/index.html等文件 有没有一种方法可以在根应用程序上下文上运行JAX-RS,但仍提供静态页面? 似乎以前在J