我理解当你需要根据IoC框架注入的依赖关系进行初始化时,spring的生命周期回调init-method
非常有用,这种依赖关系不能在常规的contructor
方法中完成。但是,与常规destroy-method
方法相比,在生命周期回调finalize
中进行清理有什么好处?
答案 0 :(得分:7)
finalize
由垃圾收集器调用,因此是not guaranteed to be invoked。
弹簧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回调)时,你一定要用它来释放资源。