ServletContextListener使用詳解

ServletContextListener使用詳解


  在servlet-api中有一個ServletContextListener接口,跟接口名描述的一致,它是用來監聽ServletContext的生命週期的,也就是監聽Web應用的生命週期。ServletContext是一個爲整個Web應用提供共享的內存的對象,任何請求都可以訪問裏面的內容。

  ServletContextListener接口中有兩個方法:

/**
  * 當Servlet 容器啓動Web 應用時調用該方法。在調用完該方法之後,容器再對Filter 初始化,
  * 並且對那些在Web 應用啓動時就需要被初始化的Servlet 進行初始化。
  */
void contextInitialized(ServletContextEvent servletContextEvent); 

/**
  * 當Servlet 容器終止Web 應用時調用該方法。在調用該方法之前,容器會先銷燬所有的Servlet 和Filter 過濾器。
  */
void contextDestroyed(ServletContextEvent servletContextEvent);

  當實現ServletContextListener時,需要重寫上述的兩個方法,同時在web.xml文件中配置我們實現的監聽器類

<listener>  
 <listener-class>com.xxx.MyListener</listener-class>
 </listener>

  當我們使用Spring時會配一個ContextLoaderListener監聽,同樣是實現自ServletContextListener

<listener>  
 <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
 </listener>

  當容器啓動時,應用先創建web.xml中註冊的監聽器對象,然後創建ServletContext對象和ServletContextEvent對象,此時ServletContextListener中的void contextInitialized(ServletContextEvent servletContextEvent);並沒有被執行,當ServletContextEvent被觸發時,執行contextInitialized方法,做一些初始化的操作。

  如果我們在ServletContextListener實現類重寫的contextInitialized方法中Spring配置文件中的Bean對象是會失敗的,因爲此時Spring中的Bean對象還沒有被注入,如果需要使用我們需要自己注入。

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        WebApplicationContext webApplicationContext= WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext());
        myService = (IMyService) webApplicationContext.getBean("myService");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章