ContextLoader.class.getClassLoader()) { currentContext = null; } //移除容器类加载器—>Web应用上下文Map集合中中key为指定类加载器的项 else if (ccl != null) { currentContextPerThread.remove(ccl); } //移除Servlet上下文中Spring Web根上下文属性 servletContext.removeAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); //释放父容器引用 if (this.parentContextRef != null) { this.parentContextRef.release(); } } }
4.WebApplicationContext接口:
WebApplicationContext是定义了Spring Web应用上下文的规范的接口,Web服务器在启动时通过该接口来启动Spring,源码如下:
[java] view plaincopyprint public interface WebApplicationContext extends ApplicationContext { //用于定义在Servlet上下文中存储Spring Web根上下文 String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT"; //请求范围 String SCOPE_REQUEST = "request"; //会话范围 String SCOPE_SESSION = "session"; //全局会话范围 String SCOPE_GLOBAL_SESSION = "globalSession"; //应用程序范围 String SCOPE_APPLICATION = "application"; //容器中存储的Servlet上下文环境的Bean名称 String SERVLET_CONTEXT_BEAN_NAME = "servletContext"; //web.xml文件中的配置Spring初始化参数的属性 String CONTEXT_PARAMETERS_BEAN_NAME = "contextParameters"; //Servlet上下文属性 String CONTEXT_ATTRIBUTES_BEAN_NAME = "contextAttributes"; //获取当前应用程序所以Web容器的标准Servlet上下文 ServletContext getServletContext(); }
5.XmlWebApplicationContext源码:
在3.(1)ContextLoader初始化Spring Web上下文的determineContextClass方法中,我们知道Spring首先通过Servlet上下文从web.xml文件中获取用户自定义配置的contextClass参数值,如果没有获取到,则默认使用Spring的XmlWebApplicationContext作为Spring Web应用的IoC容器,XmlWebApplicationContext是WebApplicationContext的实现类Configura