91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行ContextLoaderListener分析

發布時間:2021-12-08 17:50:40 來源:億速云 閱讀:174 作者:柒染 欄目:大數據

如何進行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分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

姜堰市| 河北省| 卢湾区| 津市市| 陆丰市| 武宁县| 和林格尔县| 镇平县| 修武县| 甘谷县| 法库县| 那坡县| 外汇| 明溪县| 阿克苏市| 洪雅县| 杭锦后旗| 阳新县| 兴义市| 鄂温| 海城市| 宁城县| 乐清市| 大安市| 镇康县| 湛江市| 安阳市| 卢湾区| 西青区| 新竹县| 汨罗市| 河津市| 延长县| 仙游县| 巴楚县| 利辛县| 隆林| 柘荣县| 施甸县| 鱼台县| 扎赉特旗|