Java 根上下文和DispatcherServlet上下文在SpringMVCWeb应用程序中到底是如何实现的?

Java 根上下文和DispatcherServlet上下文在SpringMVCWeb应用程序中到底是如何实现的?,java,spring,spring-mvc,jakarta-ee,servlets,Java,Spring,Spring Mvc,Jakarta Ee,Servlets,我正在学习春季MVC,我有一些疑问 因此,我有一个配置类,它配置我的DispatcherServlet,处理用户请求: public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { // Create the 'root' Spring application

我正在学习春季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

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

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

如果您自己加载一个
ApplicationContext
,并在
ServletContext
中使用上面的名称注册它,则该名称将符合根上下文的条件

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

servlet以
org.springframework.web.servlet.FrameworkServlet.context.
的名称在
ServletContext
中注册此上下文


根WAR文件是上下文。由
ContextLoaderListener
加载的bean/configuration on是根上下文,由
DispatcherServlet
加载的所有内容(或
MessageDispatcherServlet
用于Spring WS)都是子上下文。您可以有多个servlet,它们都可以访问根上下文(应该包含服务等共享资源)。现在,如果您有10个dispatcher servlet,那么根上下文应该访问哪个servlet?因此,只有父级可以从子级访问,而不是相反。这也会导致AOP出现问题,突然间,孩子定义的AOP会影响到父母。@M.Deinum Tnx,完美的解释。如果你把它作为一个回应,我会接受它:-),有很好的解释。太好了!,非常简洁的解释。你能提供一个如何实现1个根上下文和2个子上下文的例子吗?答案中已经提到了这一点,比如SpringMVC和SpringWS的组合。但是,也没有什么可以阻止您创建多个DispatcherServlet实例。