剛才看見一篇很好的文章,轉載一下:
<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應用的生命周期适當時機生效。