Spring имеет интерфейс, который вы можете реализовать под названием DestructionAwareBeanPostProcessor . Экземпляры этого интерфейса сначала спрашивают, нуждается ли бин в уничтожении методом requiresDestruction()
. Если вы вернете true, вам в конечном итоге снова будет вызван этот компонент, когда он собирается быть уничтоженным методом postProcessBeforeDestruction
.
Это дает вам возможность очистить ресурсы этого компонента. Например, если у вашего компонента есть ссылка на файл, вы можете закрыть любые потоки, которые у вас могут быть открыты. Важным моментом является то, что ваш класс не содержит ссылку на 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();
}
}