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");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章