ContextLoaderListener和RequestContextListener做了什么?

时间:2016-02-26 13:02:28

标签: spring listener web.xml

我有一个应用程序,我在使用Spring。 在我的web.xml中,我使用下面的行

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

他们是什么? 它们是强制性的吗?

2 个答案:

答案 0 :(得分:6)

org.springframework.web.context.ContextLoaderListener是Spring框架中的一个类。在实现ServletContextListener接口时,servlet容器会在启动(contextInitialized)和关闭(contextDestroyed)Web应用程序时通知它。

它专门负责Spring ApplicationContext的引导(并有序关闭)。

参考:javadoc说:

  

Bootstrap监听器启动并关闭Spring的根WebApplicationContext。只需委托ContextLoader和ContextCleanupListener。

org.springframework.web.context.request.RequestContextListener是来自同一框架的另一个类。它的javadoc说:

  

Servlet 2.4+监听器,通过LocaleContextHolder和RequestContextHolder向当前线程公开请求。要在web.xml中注册为监听器。

     

或者,Spring的RequestContextFilter和Spring的DispatcherServlet也将相同的请求上下文暴露给当前线程。与此侦听器相反,可以使用高级选项(例如“threadContextInheritable”)。

     

此侦听器主要用于第三方servlet,例如JSF FacesServlet。在Spring自己的Web支持中,DispatcherServlet的处理就足够了。

因此它通常不在Spring MVC应用程序中使用,但允许使用Spring ApplicationContext在JSF应用程序中使用请求或会话范围的bean

答案 1 :(得分:2)

通常,监听器是容器通知应用程序事件的一种方式,而不仅仅是Web请求。

例如,要在会话超时时收到通知,您需要扩展HttpSessionListener并实现sessionDestroyed()方法。然后容器会在会话到期时调用它,您可以将其与该用户的登录时间一起记录。

对于ContextLoaderListener,这使您可以在容器启动时启动应用程序的非Web相关部分,而不是等待某人点击您的某个弹簧组件。它使用web.xml中先前设置的context-param contextConfigLocation来了解要启动的内容。

对于RequestContextListener,您会收到有关请求创建和删除的通知。

是否有必要取决于应用的架构。