registerShutdownHook() 和 close() 有啥区别

Posted

技术标签:

【中文标题】registerShutdownHook() 和 close() 有啥区别【英文标题】:what is the difference between registerShutdownHook() and close()registerShutdownHook() 和 close() 有什么区别 【发布时间】:2017-02-03 06:26:24 【问题描述】:
 HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
  obj.getMessage();
  context.registerShutdownHook();  

在输出下方:

Feb 03, 2017 11:46:12 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh  
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@799f7e29: startup date [Fri Feb 03 11:46:12 IST 2017]; root of context hierarchy
Feb 03, 2017 11:46:12 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
INFO: Loading XML bean definitions from class path resource [Beans.xml]
Bean is going through init.  
Your Message : Hello World!  
Bean will destroy now.  

而使用context.close() 给出

Feb 03, 2017 11:53:57 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh  
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@799f7e29: startup date [Fri Feb 03 11:53:57 IST 2017]; root of context hierarchy
Feb 03, 2017 11:53:57 AM   org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
INFO: Loading XML bean definitions from class path resource [Beans.xml]  
Bean is going through init.  
Your Message : Hello World!    
Feb 03, 2017 11:53:57 AM org.springframework.context.support.ClassPathXmlApplicationContext doClose  
INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@799f7e29: startup date [Fri Feb 03 11:53:57 IST 2017]; root of context hierarchy  
Bean will destroy now.

有人能解释一下区别吗?

【问题讨论】:

【参考方案1】:

ApplicationContext 类没有将这些方法中的任何一个定义为其接口的一部分,但 ConfigurableApplicationContext 确实定义了这两个。

来自 JavaDoc:

close() -- 关闭此应用程序上下文,销毁其 bean 工厂中的所有 bean。 registerShutdownHook() -- 向 JVM 运行时注册一个关闭钩子,在 JVM 关闭时关闭此上下文,除非它当时已经关闭。

基本上,AbstractApplicationContext#close() 将在 ApplicationContext 被调用时关闭或关闭它,而AbstractApplicationContext#registerShutdownHook() 将在稍后 JVM 关闭时关闭或关闭 ApplicationContext不管什么原因。这将通过利用 JVM 关闭挂钩功能来实现。

在任何一种情况下,实际的关闭都是由doClose() 方法完成的。

如果您对为什么您的输出看起来如此相似感到好奇,那是因为它们实际上在做同样的事情,无论您在示例的第 3 行调用 #close() 还是 #registerShutdownHook()#close 将立即关闭,#registerShutdownHook 将在 JVM 退出之前关闭,这几乎是在方法调用完成后立即关闭,因为它是最后一行代码!

【讨论】:

关于从官方文档中调用registerShutdownHook() 只需 5 美分 - 这样做可确保正常关闭并在单例 bean 上调用相关的销毁方法,以便释放所有资源。当然,你仍然必须正确配置和实现这些销毁回调 Source

以上是关于registerShutdownHook() 和 close() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 优雅地关闭应用程序

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final