Spring:使用spring的lifecyle回调'destroy-method'比使用常规的finalize()方法有什么好处吗?

时间:2011-11-16 16:30:21

标签: java spring

我理解当你需要根据IoC框架注入的依赖关系进行初始化时,spring的生命周期回调init-method非常有用,这种依赖关系不能在常规的contructor方法中完成。但是,与常规destroy-method方法相比,在生命周期回调finalize中进行清理有什么好处?

4 个答案:

答案 0 :(得分:7)

finalize由垃圾收集器调用,因此是not guaranteed to be invoked

当弹簧容器正在销毁bean时,容器会调用

弹簧destroy-method@PreDestroy注释,例如,在应用程序关闭时,允许您取消注册服务,终止线程或执行各种清理代码。

答案 1 :(得分:5)

当bean的容器被销毁时,destroy-method更多地与管理bean销毁有关。 finalize()适用于JVM,实际上并不是直接与Spring的生命周期管理相关联。

IMO Spring管理的bean应该更喜欢destroy-method来保持交流(更明显,因为它已经明确说明),并确保在更多控制的情况下发生破坏。

答案 2 :(得分:2)

并不保证最终确定。

答案 3 :(得分:1)

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

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

每当你有一个销毁对象的机制(比如Spring框架中的destroy回调)时,你一定要用它来释放资源。