ContextLoaderListener

ContextLoaderListenerpublicclassContextLoaderListenerextendsContextLoaderimplementsServletContextListener{//实现了ServletContextListener接口(Servlet上下文监听器),可以监听web服务器上下文

大家好,欢迎来到IT知识分享网。ContextLoaderListener"

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {//实现了ServletContextListener接口(Servlet上下文监听器),可以监听web服务器上下文的启动和停止。
public ContextLoaderListener() {
    }
public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }


    /**
     * Initialize the root web application context.
     */
    @Override
    public void contextInitialized(ServletContextEvent event) {
        initWebApplicationContext(event.getServletContext());
    }


    /**
     * Close the root web application context.
     */
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }

}

 

1.作用:

当启动web服务器时,该监听器的初始化方法会被调用:

    /**
     * Initialize the root web application context.
     */
    @Override
    public void contextInitialized(ServletContextEvent event) {
initWebApplicationContext(event.getServletContext()); }
initWebApplicationContext(ServletContext)方法为监听器继承自ContextLoader类。

initWebApplicationContext方法内,首先创建XmlWebApplicationContext对象(XmlWebApplicationContext实现的接口为:WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->BeanFactory)
//如果不在web.xml中的<context-param>标签里指定<xontext-class>,//默认就创建XmlWebApplicationContext对象
this.context = createWebApplicationContext(servletContext);

然后配置并刷新该XmlWebApplicationContext对象:
configureAndRefreshWebApplicationContext(cwac, servletContext);
方法定义如下:
protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {
   if (ObjectUtils.identityToString(wac).equals(wac.getId())) {
      // The application context id is still set to its original default value
      // -> assign a more useful id based on available information
      String idParam = sc.getInitParameter(CONTEXT_ID_PARAM);
      if (idParam != null) {
         wac.setId(idParam);
      }
      else {
         // Generate default id...
         wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +
               ObjectUtils.getDisplayString(sc.getContextPath()));
      }
   }

   wac.setServletContext(sc); //S1,wac要初始化需要servlet环境相关的数据
   String configLocationParam = sc.getInitParameter(CONFIG_LOCATION_PARAM);
   if (configLocationParam != null) {
      wac.setConfigLocation(configLocationParam);//S2,读取ServletContext对象的contextConfigLocation属性指定的.xml文件,这个属性也就是web.xml里面<context-param>标签配置的<contextConfigLocation>
 } 
// The wac environment's #initPropertySources will be called in any case when the context
// is refreshed; do it eagerly here to ensure servlet property sources are in place for
// use in any post-processing or initialization that occurs below prior to #refresh
ConfigurableEnvironment env = wac.getEnvironment();
if (env instanceof ConfigurableWebEnvironment) {
((ConfigurableWebEnvironment) env).initPropertySources(sc,
null);//S3
}
customizeContext(sc, wac);
wac.refresh(); //S4.加载.xml配置的所有bean
}

最后该XmlWebApplicationContext对象赋给ServletContext,这样,每当我们拿到一个Servlet后,我们就可以获得XmlWebApplicationContext对象(IOC容器),并利用这个对象访问Spring容器管理的bean。

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

 

ServletContext对象:

1)WEB服务器会在加载一个WEB工程后创建一个唯一的WEB工程对应的ServletContext对象,工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。该对象有几个功能:

  1. 是域对象,类似map,web.xml中的<context-param>标签配置的键值对就是存放在它里面的;
  2. 可以搜索当前目录下的资源文件(.getResourceAsStream(path));
  3. 可以获取当前工程的名字(.getContextPath())。

 

 ContextLoaderListener和DispatcherServlet都配置了XmlWebApplication容器,一般要求前者扫描业务层和dao层的bean,后者只负责web层的bean。

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/33501.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信