Java中各種常見的生命周期
1.Spring bean
的生命周期?
? 1、Spring 容器根據配置中的 bean 定義中實例化 bean。
? 2、Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置。
? 3、如果 bean 實現 BeanNameAware 接口,則工廠通過傳遞 bean 的 ID 來調用 setBeanName()。
? 4、如果 bean 實現 BeanFactoryAware 接口,工廠通過傳遞自身的實例來調用 setBeanFactory()。
? 5、如果存在與 bean 關聯的任何 BeanPostProcessors,則調用 preProcessBeforeInitialization() 方法。
? 6、如果為 bean 指定了 init 方法( 的 init-method 屬性),那么將調用它。
? 7、最后,如果存在與 bean 關聯的任何 BeanPostProcessors,則將調用 postProcessAfterInitialization() 方法。
? 8、如果 bean 實現 DisposableBean 接口,當 spring 容器關閉時,會調用 destory()。
? 9、如果為 bean 指定了 destroy 方法( 的 destroy-method 屬性),那么將調用它。
2.servlet的生命周期?
Servlet生命周期可以分成四個階段:加載和實例化、初始化、服務、銷毀。
具體如下:
- 當客戶第一次請求時,首先判斷是否存在Servlet對象,若不存在,則由Web容器創建對象,
- 而后調用init()方法對其初始化,此初始化方法在整個Servlet生命周期中只調用一次。
3. 完成Servlet對象的創建和實例化之后,Web容器會調用Servlet對象的service()方法來處理請求。
- 當Web容器關閉或者Servlet對象要從容器中被刪除時,會自動調用destory()方法。
3.Java中類的生命周期是什么?
? 1. 加載,查找并加載類的二進制數據,在Java堆中也創建一個java.lang.Class類的對象
? 2. 連接,連接又包含三塊內容:驗證、準備、初始化。 1)驗證,文件格式、元數據、字節碼、符號引用驗證; 2)準備,為類的靜態變量分配內存,并將其初始化為默認值; 3)解析,把類中的符號引用轉換為直接引用
- 初始化,為類的靜態變量賦予正確的初始值
- 使用,new出對象程序中使用
- 卸載,執行垃圾回收
4. 線程的生命周期?
? 當線程被創建并啟動以后,它既不是一啟動就進入了執行狀態,也不是一直處于執行狀態。 在線程的生命周期中,它要經過新建(New)、就緒(Runnable)、運行(Running)、阻塞 (Blocked)和死亡(Dead)5 種狀態。尤其是當線程啟動以后,它不可能一直"霸占"著 CPU 獨自 運行,所以 CPU 需要在多條線程之間切換,于是線程狀態也會多次在運行、阻塞之間切換
這5種狀態如下:
(1)新建(New):創建后尚未啟動的線程處于這種狀態
(2)運行(Runable):Runable包括了操作系統線程狀態的Running和Ready,也就是處于此狀態的線程有可能正在執行,也有可能正在等待著CPU為它分配執行時間。
(3)等待(Wating):處于這種狀態的線程不會被分配CPU執行時間。等待狀態又分為無限期等待和有限期等待,處于無限期等待的線程需要被其他線程顯示地喚醒,沒有設置Timeout參數的Object.wait()、沒有設置Timeout參數的Thread.join()方法都會使線程進入無限期等待狀態;有限期等待狀態無須等待被其他線程顯示地喚醒,在一定時間之后它們會由系統自動喚醒,Thread.sleep()、設置了Timeout參數的Object.wait()、設置了Timeout參數的Thread.join()方法都會使線程進入有限期等待狀態。
(4)阻塞(Blocked):線程被阻塞了,“阻塞狀態”與”等待狀態“的區別是:”阻塞狀態“在等待著獲取到一個排他鎖,這個時間將在另外一個線程放棄這個鎖的時候發生;而”等待狀態“則是在等待一段時間或者喚醒動作的發生。在程序等待進入同步區域的時候,線程將進入這種狀態。
(5)結束(Terminated):已終止線程的線程狀態,線程已經結束執行。