如您所知,ContextLoaderListener是负责初始化和销毁ApplicationContext的,当您关闭服务器时,会调用ContextLoaderListener的contextDestroyed方法.
public void contextDestroyed(ServletContextEvent event){
closeWebApplicationContext(event.getServletContext());
ContextCleanupListener.cleanupAttributes(event.getServletContext());
}
在那个closeWebApplicationContext中,它们实际上像这样在ApplicationContext上调用close方法
if ((this.context instanceof ConfigurableWebApplicationContext)) {
((ConfigurableWebApplicationContext)this.context).close();
}
这是直接来自spring-web-4.1.5.jar.从这里可以看出,他们使用close来破坏Web应用程序中的ApplicationContext.
但是,registerShutdownHook用于显式关闭非Web应用程序中的IoC容器,就像独立的桌面应用程序一样,特别是当您从ClassPathXmlApplicationContext(或)FileSystemXmlApplicationContext(或)某些其他类型手动创建ApplicationContext时.
这样做是为了释放spring应用程序使用的所有资源,并在spring bean上调用destroy方法(如果有的话).