如何实现一个在原型上调用 destroy 方法的 bean 后处理器?

Pav*_*vel 4 java spring prototype spring-ioc

我正在阅读 Spring 文档并发现了这个

让 Spring 容器释放原型范围 bean 使用的资源的一种可能方法是使用自定义 bean 后处理器,该处理器将保存对需要清理的 bean 的引用。

但是,如果bean后处理器持有对原型对象的引用,那么垃圾收集器将不会清理它,并且原型bean及其资源将驻留在堆中,直到应用程序上下文关闭?

请您澄清一下好吗?

Tod*_*odd 5

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)