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() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等
shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]