如何实现在原型上调用destroy方法的bean-post处理器?

时间:2018-08-30 22:24:12

标签: java spring prototype spring-ioc

我正在阅读Spring文档并找到了

  

一种使Spring容器释放所用资源的可能方法   通过原型范围的bean是通过使用自定义bean   后处理程序将保存对需要   被清理。

但是,如果bean后处理器持有对原型对象的引用,那么垃圾收集器将不会清理它,并且具有其资源的原型bean将驻留在堆中,直到Application Context关闭为止。

请您澄清一下吗?

1 个答案:

答案 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();
    }
}