我正在学习 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)究竟代表上下文的是什么?我认为这类似于一组具有特定pourpose并且可以在环境中工作的bean。但我绝对不是这个断言的真实。
2)根上下文与调度程序servlet上下文之间有什么区别?
3)根据我的理解, dispatcherContext 中定义的bean可以访问 rootContext 中定义的bean(但相反的情况并非如此)。为什么呢?
TNX
答案 0 :(得分:27)
Spring应用程序中的根上下文是由ApplicationContext
加载的ContextLoaderListener
。此上下文应具有全局可用资源,如服务,存储库,基础架构bean(DataSource
,EntityManagerFactory
等)等。
ContextLoaderListener
在名称ServletContext
下的org.springframework.web.context.WebApplicationContext.ROOT
中注册此上下文。
如果你自己加载ApplicationContext
并在ServletContext
中使用上面的名称注册它,那么它就有资格作为根上下文。
Spring应用程序中的子上下文是由ApplicationContext
(或者例如Spring-WS应用程序中的DispatcherServlet
)加载的MessageDispatcherServlet
。对于Spring MVC,此上下文应该只包含与该上下文相关的bean,ViewResolver
s,HandlerMapping
等。
servlet在名称ServletContext
下的org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name>
中注册此上下文。
只有子上下文才能访问父上下文,因为您可以拥有多个子上下文。例如,在Spring MVC中结合Spring WS应用程序。子项通过在ServletContext
中使用众所周知的名称查找它来检测父上下文。
如果根上下文可以访问哪个孩子将用于连接bean?接下来如果是这样的话,当涉及AOP时你也会得到令人惊讶的结果。子上下文中定义的AOP会突然影响根上下文中配置的bean。