很多辅导教材,网络教程都认为,webApplicationContext是由contextLoaderListener或者contextLoaderServlet加载web.xml中的param参数contextConfigLocation初始化的。起初我也这么认为,但通过对Rod johnson的《spring框架高级编程》中相关知识的学习和查看相关代码,我发现事情并非如此。
由contextLoaderListener(或者contextlorderServlet)加载的并非webApplicationContext,而是webApplicationContext的父context,这个ApplicationContext被初始化后,因为是rootContext,其父context被设为空,并在生成过程中将其自身绑定为servletContext的一个属性。ApplicationContext是由contextLoaderListener(或者contextLorderServlet)生成的contextLoader生成的。contextLoader的initwebapplicationcontext()方法(此方法中生成父context,此时显然为null),createwebapplicationcontext()方法(此方法中生成ApplicationContext,设置父context,即null)具体生成ApplicationContext。
而正真的webApplicationContext是由DispatcherServlet初始化的。首先看web.xml有没有给DispatcherServlet定义 init-param参数contextconfiglocation,如果有就由此参数指定的配置文件初始化webApplicationContext;若没有,会根据dispatcherServlet的namespace属性指定的配置文件(一般为[servletname]-servlet.xml文件)来生成webApplicationContext。与ApplicationContext不同,webApplicationContext是由DispatcherServlet中的initwebapplicationcontext()(因为contextloader生成ApplicationContext一般会设置较高的优先级,所以此时方法中可按名索引已经绑定为ServletContext属性的ApplicationContext,作为父context),和createwebapplicationcontext()(此方法中生成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.WebApplicationObjectSupport,调用其方法getWebApplicationContext(),getServletContext()访问web应用上下文,或ServletContext。
我的第一篇:浅析spring中的webApplicationContext
最新推荐文章于 2024-07-17 09:16:46 发布