很多辅导教材,网络教程都认为,webApplicationContext是由 contextLoaderListener或者contextLoaderServlet加载web.xml中的param参数 contextConfigLocation初始化的。起初我也这么认为,但通过对Rod johnson的《spring框架高级编程》中相关知识的学习和查看相关代码,我发现事情并非如此。
由 contextLoaderListener(或者contextlorderServlet)加载的并非webApplicationContext, 而是webApplicationContext的父context,这个ApplicationContext被初始化后,因为是 rootContext,其父context被设为空,并在生成过程中将其自身绑定为servletContext的一个属性。 ApplicationContext是由contextLoaderListener(或者contextLorderServlet)生成的 contextLoader生成的。contextLoader的initwebapplicationcontex t()方法(此方法中生成父 context,此时显然为null),createwebapplicationcont ext()方法(此方法中生成 ApplicationContext,设置父context,即null)具体生成ApplicationContext。
而真正 的webApplicationContext是由DispatcherServlet初始化的。首先看web.xml有没有给 DispatcherServlet定义 init-param参数contextconfiglocation,如果有就由此参数指定的配置文件初始化 webApplicationContext;若没有,会根据dispatcherServlet的namespace属性指定的配置文件(一般为 [servletname]-servlet.xml文件)来生成webApplicationContext。与ApplicationContext 不同,webApplicationContext是由DispatcherServlet中的initwebapplicationcontex t() (因为contextloader生成ApplicationContext一般会设置较高的优先级,所以此时方法中可按名索引已经绑定为 ServletContext属性的ApplicationContext,作为父context),和 createwebapplicationcont ext()(此方法中生成webApplicationContext,设置父context,即 ApplicationContext)生成的。生成的webapplicationcontext以 org.springframework.web.servlet.Frameworkservlet.CONTEXT为key保存在 servletcontext里。
Spring Web应用程序中的每个DispathcherServlet都有一个关联的webApplicationContext,当有多个 DispathcherServlet时,其他DispathcherServlet不能使用由特定DispathcherServlet初始化的 webApplicationContext。webApplicationContext与DispathcherServlet集成,并管理所有 web相关组件,如控制器,视图,URL映射及拦截器。webApplicationContext继承了ApplicationContext的所有功 能,此外还持有一个servletContext的引用(与servletcontext绑定)。如有需要,可扩展 org.springframework.web.context.support.WebApplicationObjectSupp ort,调用其方 法getWebApplicationContext (),getServletContext()访问web应用上下文,或 ServletContext。
浅析spring中的webApplicationContext
最新推荐文章于 2024-07-17 09:16:46 发布