什么是鉤子函數(shù),在學習鉤子函數(shù)之前,小編先提一個面試問題。
請問在Spring中,如果JVM異常終止,Spring是如何保證會釋放掉占用的資源,比如說數(shù)據(jù)庫連接等資源呢?
鉤子函數(shù)非常簡單,簡單到小編只用摘抄一段Spring代碼即可。走你,現(xiàn)在開始。
Spring 容器中 Bean 在什么時候執(zhí)行銷毀方法?
我們知道在Spring中定義銷毀方法有兩種方式
- 實現(xiàn) DisposableBean 的 destroy 方法。
- 使用 @PreDestroy 注解修飾方法
那么在什么時候執(zhí)行銷毀方法?
- 主動執(zhí)行銷毀bean
- JVM關閉時候自動執(zhí)行銷毀方法。
這里就要用到鉤子函數(shù)了, Spring 的鉤子函數(shù)在 AbstractApplicationContext#shutdownHook屬性。
如果我們是SpringBoot項目我們看到在SpringApplication啟動時候會注冊一個鉤子函數(shù)
如何定義鉤子函數(shù)?
簡直太簡單了,沒有任何學習成本。一行代碼就能搞定。
觸發(fā)鉤子函數(shù)的場景
只要不是機器斷電,強制kill -9 強制殺進程,都會觸發(fā)。
鉤子函數(shù)能做什么?
正如上圖所示優(yōu)雅停機,在項目將要關閉時候,主動釋放程序占用的資源信息,釋放db連接池的連接等其他占用的資源信息。 如果我們是 Spring 項目其實我們不用自己定義鉤子函數(shù),我們只要使用Spring提供給我們的銷毀方法即可。因為 Spring定義的鉤子函數(shù)中會去執(zhí)行, DisposableBean.destory() 和被 PreDestroy 修飾的方法。
doClose()方法會執(zhí)行bean的destroy(),也會執(zhí)行SmartLifeCycle的stop()方法,我們就可以通過重寫這些方法來實現(xiàn)對象的關閉,生命周期的管理,實現(xiàn)平滑shutdown。