【发布时间】:2015-08-18 19:53:22
【问题描述】:
我正在学习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 的工作原理对我来说非常清楚。我的疑问与 context 概念有关。
1) 上下文究竟代表什么?我认为这就像一组具有特定用途的豆子,并且可以在环境中协同工作。但我对这个断言绝对不正确。
2) 根上下文和dispatcher servlet上下文有什么区别?
3) 据我了解,dispatcherContext 中定义的 bean 可以访问 rootContext 中定义的 bean(但反之则不然)。为什么?
Tnx
【问题讨论】:
-
你的 WAR 文件就是上下文。
-
ContextLoaderListener加载的 Beans/configuraiton 是根上下文,DispatcherServlet(或 Spring-WS 的MessageDispatcherServlet)加载的所有内容都是子上下文。您可以拥有多个 servlet,它们都可以访问根上下文(应该包含共享资源,如服务等)。现在,如果您有 10 个调度程序 servlet,根上下文应该访问哪个 servlet?因此,只有父母可以从孩子那里访问,而不是相反。这也会导致 AOP 出现问题,突然间,子级定义的 AOP 会影响父级。 -
@M.Deinum Tnx 这么多,完美的解释。如果你把它作为回应我会接受它:-)
标签: java spring spring-mvc jakarta-ee servlets