[英]How exactly are the root context and the dispatcher servlet context into a Spring MVC web application?
我正在學習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應用程序中的根上下文是ContextLoaderListener
加載的ApplicationContext
。 此上下文應具有全局可用的資源,例如服務,存儲庫,基礎結構Bean( DataSource
, EntityManagerFactory
等)等。
ContextLoaderListener
將此上下文以org.springframework.web.context.WebApplicationContext.ROOT
的名稱注冊到ServletContext
。
如果您自己加載ApplicationContext
並在ServletContext
中使用上面的名稱注冊它,則該名稱將成為根上下文。
Spring應用程序中的子上下文是由DispatcherServlet
(或例如Spring-WS應用程序中的MessageDispatcherServlet
)加載的ApplicationContext
。 對於Spring MVC,此上下文應僅包含與該上下文相關的bean,例如ViewResolver
, HandlerMapping
等等。
servlet在ServletContext
中以org.springframework.web.servlet.FrameworkServlet.CONTEXT.<servlet-name>
名稱注冊此上下文。
只有子上下文可以訪問父上下文,因為您可以擁有多個子上下文。 例如,在結合了Spring WS應用程序的Spring MVC中。 子上下文可以通過在ServletContext
以眾所周知的名稱找到父上下文來檢測它們。
如果根上下文可以訪問該子項,那么它將使用哪個來關聯bean? 如果是這種情況,那么接下來,當涉及AOP時,您還將得到令人驚訝的結果。 在子上下文中定義的AOP會突然影響在根上下文中配置的Bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.