您好,登錄后才能下訂單哦!
如何進行ContextLoaderListener分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
每一個整合spring框架的項目中,總是不可避免地要在web.xml中加入這樣一段配置。
<!-- 讀取spring配置文件 開始 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:conf/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
但是很多同學并不清楚它到底有什么作用。
web.xml的配置文件,在啟動Web 容器時,自動裝配Spring applicationContext.xml
的配置信息。
我們研究一下ContextLoaderListener源碼。
ContextLoaderListener繼承自ContextLoader,實現的是ServletContextListener接口。
public class ContextLoaderListener extends ContextLoader implements
ServletContextListener {
public ContextLoaderListener() {}
public ContextLoaderListener(WebApplicationContext context) {
super(context);
}
public void contextInitialized(ServletContextEvent event) {
this.initWebApplicationContext(event.getServletContext());
}
public void contextDestroyed(ServletContextEvent event) {
this.closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
}
ContextLoaderListener可以指定在Web應用程序啟動時載入Ioc容器,正是通過
ContextLoader來實現的,ContextLoader來完成實際的WebApplicationContext,
也就是Ioc容器的初始化工作。
ContextLoaderListener的作用就是啟動Web容器時,讀取在contextConfigLocation中定義的xml文件,自動裝配ApplicationContext的配置信息,并產生WebApplicationContext對象,然后將這個對象放置ServletContext
的屬性里,這樣我們只要得到Servlet就可以得到WebApplicationContext對象,并利用這個對象訪問spring容器管理的bean。簡單來說,就是上面這段配置為項目提供了spring支持,初始化了Ioc容器。
在上下文創建時調用的方法是public void contextInitialized(ServletContextEvent event)。它通過傳遞給它所接收到的servlet上下文(從事件參數獲取event.getServletContext())來調用ContextLoader的initWebApplicationContext方法。initWebApplicationContext方法進行的第一個操作是檢查是否有另一個根上下文存在。如果至少存在另一個,則拋出IllegalStateException,并且初始化失敗。否則,它繼續初始化
org.springframework.web.context.WebApplicationContext實例。如果初始化的實例實現了ConfigurableWebApplicationContext接口,則在設置當前應用程序上下文之前,加載器將進行一些設置服務(父上下文,應用程序上下文,servlet上下文等),并通過上下文的refresh()方法來準備bean
ContextLoaderListener中第二個我們需要關注的方法是public void contextDestroyed(ServletContextEvent event)。每當加載程序的上下文關閉時都會調用它。這個方法干了兩件事情:
通過ContextLoader中的closeWebApplicationContext(),它關閉應用程序上下文。通過ConfigurableWebApplicationContext close()方法完成上下文關閉。上下文的銷毀的過程其實就是銷毀bean和關閉bean工廠,此處參考org.springframework.context.support.AbstractApplicationContext中的源碼。
調用
ContextCleanupListener.cleanupAttributes(event.getServletContext()),它將查找當前servlet上下文的所有實現org.springframework.beans.factory.DisposableBean接口的對象。之后,將調用它們的destroy()方法,以銷毀不再使用的bean。
ServletContextListener 是 ServletContext 的監聽者,如果 ServletContext
發生變化,如服務器啟動時ServletContext 被創建,服務器關閉時
ServletContext 將要被銷毀。
ServletContext 被 Servlet 程序用來與 Web 容器通信。例如寫日志,轉發請求。每一個 Web 應用程序含有一個Context ,被Web 應用內的各個程序共享。因為Context 可以用來保存資源并且共享,所以我所知道ServletContext
的最大應用是Web 緩存---- 把不經常更改的內容讀入內存,所以服務器響應請求的時候就不需要進行慢速的磁盤I/O 了。
在JSP 文件中,application 是 ServletContext 的實例,由JSP 容器默認創建。Servlet 中調用getServletContext() 方法得到 ServletContext 的實例。
我們使用緩存的思路大概是:
1. 服務器啟動時,ServletContextListener 的 contextInitialized() 方法被調用,所以在里面創建好緩存。可以從文件中或者從數據庫中讀取取緩存內容生成類,用 ervletContext.setAttribute() 方法將緩存類保存在ServletContext 的實例中。
2. 程序使用 ServletContext.getAttribute() 讀取緩存。如果是 JSP ,使用a pplication.getAttribute() 。如果是Servlet ,使用 getServletContext().getAttribute() 。如果緩存發生變化( 如訪問計數) ,你可以同時更改緩存和文件/ 數據庫。或者你等 變化積累到一定程序再保存,也可以在下一步保存。
3. 服務器將要關閉時,ServletContextListener 的 contextDestroyed() 方法被調用,所以在里面保存緩存的更改。將更改后的緩存保存回文件或者數據庫,更新原來的內容。
看完上述內容,你們掌握如何進行ContextLoaderListener分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。