我正在阅读Spring文档并找到了
一种使Spring容器释放所用资源的可能方法 通过原型范围的bean是通过使用自定义bean 后处理程序将保存对需要 被清理。
但是,如果bean后处理器持有对原型对象的引用,那么垃圾收集器将不会清理它,并且具有其资源的原型bean将驻留在堆中,直到Application Context关闭为止。
请您澄清一下吗?
答案 0 :(得分:1)
Spring有一个您可以实现的名为DestructionAwareBeanPostProcessor的接口。首先通过requiresDestruction()
方法询问此接口的实例是否需要销毁bean。如果返回true,则最终将要通过postProcessBeforeDestruction
方法销毁该bean时再次使用该bean。
这是做什么的,它使您有机会清理该bean的资源。例如,如果您的bean引用了File,则可以关闭所有可能已打开的流。重要的一点是您的类没有保存对将要销毁的Bean的引用,否则您将无法像所指出的那样对它进行垃圾收集。
要定义后处理器,您将执行以下操作(未经测试)
@Component
public class MyDestructionAwareBeanPostProcessor implements DestructionAwareBeanPostProcessor {
public boolean requiresDestruction(final Object bean) {
// Insert logic here
return bean instanceof MyResourceHolder;
}
public void postProcessBeforeDestruction(final Object bean, final String beanName) throws BeansException {
// Clean up bean here.
// Example:
((MyResourceHolder)bean).cleanup();
}
}