對象的生命週期


對象的生命週期

當一個對象通過new語句創建後,它就會擁有一塊固定的內存空間,如果沒有任何變量引用它,它就會結束生命週期,它佔用的內存空間隨時可能被JVM的垃圾回收器回收。

應用程序如何管理對象的生命週期呢?目前比較流行的做法是把對象存放在一個“範圍”內。例如在JavaWeb應用中,JavaBean可以存放在request、session或application範圍內。每個範圍對應一個對象,例如request範圍對應HttpServletRequest對象,session範圍對應HttpSession對象,application範圍對應ServletContext對象。把一個JavaBean存放在request範圍內,實質上是在HttpServletRequest對象的一個集合屬性中加入這個JavaBean的引用,這個集合屬性也被稱爲HttpServletRequest對象的緩存。


把一個JavaBean存放在request範圍內,等價於以下兩種說法:
把一個JavaBean加入到HttpServletRequest對象的緩存中
把一個JavaBean和HttpServletRequest對象關聯

當JavaBean位於request範圍內,這個JavaBean的生命週期依賴於HttpServletRequest對象的生命週期,當HttpServletRequest對象結束生命週期,並且這個JavaBean也不被應用程序中的其他變量引用,那麼它就會結束生命週期。

那麼HttpServletRequest對象本身的生命週期由誰管理呢?這是由JavaWeb容器(也稱Servlet容器)來管理的。對於每個HTTP請求,JavaWeb容器會自動創建一個HttpServletRequest對象,當HTTP請求的響應完畢,JavaWeb容器就會結束這個對象的生命週期。同理,當每個HTTP會話開始,JavaWeb容器會自動創建一個HttpSession對象,當這個會話結束,JavaWeb容器就會結束這個對象的生命週期;當每個JavaWeb應用啓動時,JavaWeb容器會自動創建一個ServletContext對象,當這個應用被關閉,JavaWeb容器就會結束這個對象的生命週期。

在Hibernate中,在net.sf.hibernate.Session範圍內加入一個持久化對象,實質上是在Session對象的集合屬性中加入這個持久化對象的引用。以下幾種說法是等價的:
在Session範圍內加入一個持久化對象
在Session的緩存中加入一個持久化對象 
把一個持久化對象與Session關聯

值得注意的是,Hibernate的Session不僅能管理緩存中持久化對象的生命週期,還會負責按照持久化對象的狀態的變化,來同步更新數據庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章