当前位置: 首页 > 面试题库 >

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

仰翔
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/");
   }
}

我很清楚 DispatcherServlet的 工作方式。我的怀疑与 上下文 概念有关。

1)确切表示 上下文 ?我认为这就像一组具有特定用途的豆类,可以在环境中工作。但是我绝对不正确。

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

3)据我了解,在 dispatcherContext中 定义的bean 可以访问在 rootContext中 定义的 bean
(但事实并非如此)。为什么?

特纳克斯


问题答案:

根上下文

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

ContextLoaderListener注册此背景下的ServletContext名下org.springframework.web.context.WebApplicationContext.ROOT

如果您ApplicationContext自己加载并在中使用上述名称注册ServletContext,则将其视为根上下文。

子语境

Spring应用程序中的子上下文ApplicationContext是由DispatcherServlet(或例如MessageDispatcherServletSpring-
WS应用程序中的)加载的。对于Spring
MVC,此上下文应仅包含与该上下文相关的bean,例如ViewResolvers,HandlerMappings等。

Servlet将这个上下文以ServletContext名称注册在中org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet- name>

根<子关系

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

如果根上下文可以访问该子项,它将使用哪个来关联bean?如果是这种情况,那么接下来,当涉及AOP时,您还将得到令人惊讶的结果。在子上下文中定义的AOP会突然影响在根上下文中配置的Bean。



 类似资料:
  • 我正在学习Spring MVC,我有一些相关的疑问 因此,我有这个配置类来配置处理用户请求的DispatcherServlet: 3)根据我的理解,在dispatcherContext中定义的bean可以访问在rootContext中定义的bean(但相反的情况并非如此)。为什么? TNX

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

  • 问题内容: 到目前为止,我以前一直认为Web应用程序只能具有我们在 我这样想对吗? 我可以在一个Web应用程序中拥有多个调度程序Servlet吗?如果是,如何? 在什么情况下我们可能需要这样做? 整个Web应用程序中只能有一个应用程序上下文吗? 我们如何定义多个应用程序上下文? 非Spring应用程序中可以存在吗? 问题答案: 一个Web应用程序中可以有多个调度程序servlet吗? Web应用程

  • 我正在阅读spring framework文档,现在我正在讨论应用程序范围概念。关于这个概念的文档是这样说的: 这有点类似于Spring单例bean,但有两个重要的区别:它是每个ServletContext的单例,而不是每个Spring ApplicationContext的单例 对我来说,不清楚的是我们如何想象Spring应用程序上下文和Servlet上下文之间的关系。 那么,Spring应用程

  • 我发现解决方案是在dispatcher上下文配置中插入“ ”元素。 我觉得这可能是一个糟糕的解决方案,因为我的应用程序上下文配置文件中有类似的“ ”,以便一次性处理所有其他依赖项。 问题是为什么 在应用程序级别没有正确地选择@requestmapping注释?我知道我可以限制组件扫描的基础包在应用程序级别的某些包,但我的意图是只使用一个组件扫描在应用程序级别,仅此而已。我真的必须使用两个不同的组件

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