天天看點

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應用的生命周期适當時機生效。