Java 根上下文和DispatcherServlet上下文在SpringMVCWeb应用程序中到底是如何实现的?
我正在学习春季MVC,我有一些疑问 因此,我有一个配置类,它配置我的DispatcherServlet,处理用户请求: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
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实例。