1. 程式人生 > >destroy方法與鉤子函式

destroy方法與鉤子函式

結論

  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關閉過程

  1. 釋出ContextClosedEvent事件;
  2. 銷燬容器中所有的bean;
  3. 關閉容器本身;

bean的銷燬過程

  1. 首先,從disposableBeans獲取所有待銷燬的bean,然後倒序依次銷燬(與建立順序相反);
    在這裡插入圖片描述
  2. 先銷燬依賴當前bean的其它bean,再銷燬當前bean;
    在這裡插入圖片描述

註冊到disposableBeans的幾種情況

  1. 實現了DisposableBean介面;
  2. 在xml配置檔案中自定義了destroy方法;
  3. 實現了AutoCloseable介面;

參考:

  1. https://my.oschina.net/evermaze/blog/1594330;