Pav*_*vel 4 java spring prototype spring-ioc
我正在阅读 Spring 文档并发现了这个
让 Spring 容器释放原型范围 bean 使用的资源的一种可能方法是使用自定义 bean 后处理器,该处理器将保存对需要清理的 bean 的引用。
但是,如果bean后处理器持有对原型对象的引用,那么垃圾收集器将不会清理它,并且原型bean及其资源将驻留在堆中,直到应用程序上下文关闭?
请您澄清一下好吗?
Spring 有一个可以实现的接口,称为DestructionAwareBeanPostProcessor。首先询问此接口的实例是否需要通过该requiresDestruction()方法销毁 bean。如果返回 true,当该 bean 即将通过该方法销毁时,您最终将再次被回调postProcessBeforeDestruction。
这样做的目的是让您有机会清理该 bean 的资源。例如,如果您的 bean 具有对文件的引用,您可以关闭您可能打开的任何流。重要的一点是你的类不保存对即将被销毁的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |