天天看点

listener配置

刚才看见一篇很好的文章,转载一下:

<a target="_blank" href="http://www.cnblogs.com/hellojava/archive/2012/12/26/2833840.html">http://www.cnblogs.com/hellojava/archive/2012/12/26/2833840.html</a>

以下文章完全为复制粘贴。

1、listener的定义与作用

  监听器listener就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

  listener是servlet的监听器,可以监听客户端的请求,服务端的操作等。

2、listener的分类与使用

  主要有以下三类:

  1、servletcontext监听

  servletcontextlistener:用于对servlet整个上下文进行监听(创建、销毁)。

  servletcontextattributelistener:对servlet上下文属性的监听(增删改属性)。

  2、session监听

  session属于http协议下的内容,接口位于javax.servlet.http.*包下。

  httpsessionlistener接口:对session的整体状态的监听。

  httpsessionattributelistener接口:对session的属性监听。

  session的销毁有两种情况:

  1、session超时,web.xml配置:

  2、手工使session失效

  3、request监听

  servletrequestlistener:用于对request请求进行监听(创建、销毁)。

  servletrequestattributelistener:对request属性的监听(增删改属性)。

  4、在web.xml中配置

  listener配置信息必须在filter和servlet配置之前,listener的初始化(servletcontentlistener初始化)比servlet和filter都优先,而销毁比servlet和filter都慢。

3、listener应用实例

  1、利用httpsessionlistener统计最多在线用户人数

  2、spring使用contextloaderlistener加载applicationcontext配置信息

  contextloaderlistener的作用就是启动web容器时,自动装配applicationcontext的配置信息。因为它实现了servletcontextlistener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

  contextloaderlistener如何查找applicationcontext.xml的配置位置以及配置多个xml:如果在web.xml中不写任何参数配置信息,默认的路径是"/web-inf/applicationcontext.xml",在web-inf目录下创建的xml文件的名称必须是applicationcontext.xml(在myeclipse中把xml文件放置在src目录下)。如果是要自定义文件名可以在web.xml里加入contextconfiglocation这个context参数。

  3、spring使用log4jconfiglistener配置log4j日志

  spring使用log4jconfiglistener的好处:

动态的改变记录级别和策略,不需要重启web应用。

把log文件定在 /web-inf/logs/ 而不需要写绝对路径。因为系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了。

可以把log4j.properties和其他properties一起放在/web-inf/ ,而不是class-path。

设置log4jrefreshinterval时间,开一条watchdog线程每隔段时间扫描一下配置文件的变化。

  4、spring使用introspectorcleanuplistener清理缓存

  这个监听器的作用是在web应用关闭时刷新jdk的javabeans的introspector缓存,以确保web应用程序的类加载器以及其加载的类正确的释放资源。

  如果javabeans的introspector已被用来分析应用程序类,系统级的introspector缓存将持有这些类的一个硬引用。因此,这些类和web应用程序的类加载器在web应用程序关闭时将不会被垃圾收集器回收!而introspectorcleanuplistener则会对其进行适当的清理,已使其能够被垃圾收集器回收。

  唯一能够清理introspector的方法是刷新整个introspector缓存,没有其他办法来确切指定应用程序所引用的类。这将删除所有其他应用程序在服务器的缓存的introspector结果。

  在使用spring内部的bean机制时,不需要使用此监听器,因为spring自己的introspection results cache将会立即刷新被分析过的javabeans introspector cache,而仅仅会在应用程序自己的classloader里面持有一个cache。虽然spring本身不产生泄漏,注意,即使在spring框架的类本身驻留在一个“共同”类加载器(如系统的classloader)的情况下,也仍然应该使用使用introspectorcleanuplistener。在这种情况下,这个introspectorcleanuplistener将会妥善清理spring的introspection

cache。

  应用程序类,几乎不需要直接使用javabeans introspector,所以,通常都不是introspector resource造成内存泄露。相反,许多库和框架,不清理introspector,例如: struts和quartz。

  需要注意的是一个简单introspector泄漏将会导致整个web应用程序的类加载器不会被回收!这样做的结果,将会是在web应用程序关闭时,该应用程序所有的静态类资源(比如:单实例对象)都没有得到释放。而导致内存泄露的根本原因其实并不是这些未被回收的类!

  注意:introspectorcleanuplistener应该注册为web.xml中的第一个listener,在任何其他listener之前注册,比如在spring's contextloaderlistener注册之前,才能确保introspectorcleanuplistener在web应用的生命周期适当时机生效。