Java Spring:使用Spring&x27有什么好处吗;s生命周期回调&x27;销毁方法';过正则finalize()方法?

Java Spring:使用Spring&x27有什么好处吗;s生命周期回调&x27;销毁方法';过正则finalize()方法?,java,spring,Java,Spring,我知道spring的生命周期回调init方法在您需要基于IoC框架注入的依赖项进行初始化时非常有用,而这些依赖项在常规构造函数方法中无法完成。但是在生命周期回调destroy方法中进行清理比常规finalize方法有什么好处呢?由垃圾收集器调用,因此是 当spring容器正在销毁bean时(例如,应用程序关闭时),容器将调用spring或annotation,从而允许您取消注册服务、终止线程或执行各种清理代码 和finalize不保证被调用。销毁方法在bean的容器被销毁时更多地用于管理bean

我知道spring的生命周期回调
init方法
在您需要基于IoC框架注入的依赖项进行初始化时非常有用,而这些依赖项在常规
构造函数
方法中无法完成。但是在生命周期回调
destroy方法
中进行清理比常规
finalize
方法有什么好处呢?

由垃圾收集器调用,因此是


当spring容器正在销毁bean时(例如,应用程序关闭时),容器将调用spring或annotation,从而允许您取消注册服务、终止线程或执行各种清理代码

和finalize不保证被调用。

销毁方法在bean的容器被销毁时更多地用于管理bean销毁
finalize()
实际上是针对JVM的,它与Spring的生命周期管理没有直接联系


IMO Spring托管bean应该更喜欢
destroy方法
,既可以保持事情的沟通性(这更明显,因为它被明确说明),又可以确保在更可控的情况下进行销毁。

其他人提供了很好的答案,但我想我应该在
finalize()上添加一条解释
方法

作为一种良好的做法,您不应该将应用程序关键代码放入
finalize()
方法中,因为无法保证何时调用它(或者是否调用它)。您可以在其中放入一些最后的努力代码,以确保释放类所使用的资源(例如文件或通信端口),但决不能依赖此方法来执行任何所需的清理


每当您有销毁对象的机制(如Spring框架中的销毁回调)时,您都应该使用它来释放资源。

在非“常规”中完成,并且您不应该依赖它-这取决于垃圾收集器是否调用它,在它选择的时候,使用它是不好的做法it@Guillaume:我所说的“常规”是指java本身的一部分,而不是特定于spring的。但是谢谢你的回复。我说的“不定期”是指JVM使用它,而不是用户:)除非你真的知道自己在做什么。在这种情况下,不要忘记在finally子句中调用super.finalize()。@Guillaume:我承认
destroy
不是常规的:-)您不能在
finalize()中放置相同的清理代码吗?是否有任何特定于spring framework的清理必须在
销毁方法中进行?是的,您可以在
finalize
中放置相同的代码,但并不总是保证它会运行或及时运行