ContextLoaderListener实现了servletContextListener接口,用来加载和关闭spring根上下文。它根据WebApplicationContext来创建一个实例,同时会将该上下文注册进ServletContext,并且它的生命周期方法会被该Listener调用,也就是Listener会监听其生命周期,而由于一个每个web应用只有一个context,所以也就是监听应用的生命周期。
ContextLoaderListener配置在web.xml中,因为当项目启动时,服务器会先读取web.xml文件中的配置,没有出错项目才会启动起来,所以配置文件的路径也要声明:
创建Listener:
通过servletContext.getResource()方法获得ServletContext类的实例,来初始化Spring web应用的上下文,ServletContextEvent用来通知servlet上下文发生变化。首先判断WebApplicationContext的ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE是否为null,不为null说明已经有了一个上下文,不能在初始化了;为null则进行初始化的过程,首先要通过servlet获得应用的context类,再注册进前面的那个attribute,如果当前线程的contextClassLoader是ContextLoader类的类加载器的一个实例,则当前的上下文就是刚创建的上下文,否则就要把类加载器和该上下文类放入Map中,形成对应的线程上下文和线程的上下文加载器之间的映射关系:
通过servletContext.getResource()方法获得一个ServletContext类的实例,来关闭Spring web应用上下文,清除映射关系,同时清除属性,因为创建Listener时传入的上下文在注册进servlet context时是以属性名注册的:
closeWebApplicationContext方法中:
WebApplicationContext用来给一个web应用提供配置,主要是让根context一定是在启动进程中。
上面的属性用来在成功启动的时候将WebApplication绑定到Context属性名;如果启动失败该属性名会包含相关错误信息。
ServletContext接口定义了一系列的方法用于让servlet和它的servlet容器进行通信,例如获取文件的MIME类型,分发request,写log文件等等。