destroy方法與鉤子函式
阿新 • • 發佈:2018-12-17
結論
JVM關閉時,會觸發鉤子函式,Spring會在註冊的鉤子函式中回撥bean的destroy方法銷燬bean;
註冊過程
註冊時機:Spring容器啟動時,run() --> refreshContext(),如下圖所示
註冊邏輯如下,AbstractApplicationContext.registerShutdownHook()
public void registerShutdownHook() { if (this.shutdownHook == null) { // No shutdown hook registered yet. this.shutdownHook = new Thread() { @Override public void run() { synchronized (startupShutdownMonitor) { doClose(); } } }; Runtime.getRuntime().addShutdownHook(this.shutdownHook); } }
Spring關閉過程
- 釋出ContextClosedEvent事件;
- 銷燬容器中所有的bean;
- 關閉容器本身;
bean的銷燬過程
- 首先,從disposableBeans獲取所有待銷燬的bean,然後倒序依次銷燬(與建立順序相反);
- 先銷燬依賴當前bean的其它bean,再銷燬當前bean;
註冊到disposableBeans的幾種情況
- 實現了DisposableBean介面;
- 在xml配置檔案中自定義了destroy方法;
- 實現了AutoCloseable介面;
參考: