Как реализовать обработчик bean-post, который вызывает методы уничтожения на прототипах? - PullRequest
0 голосов
/ 31 августа 2018

Я читаю документацию Spring и нашел это

Один из возможных способов заставить контейнер Spring освобождать используемые ресурсы бобами-прототипами с помощью пользовательских бобов постпроцессор, который будет содержать ссылку на бины, которые должны быть убранным.

Но если обработчик bean-post содержит ссылку на объект-прототип, сборщик мусора не сможет его очистить, а прототипы bean-компонентов с их ресурсами будут находиться в куче, пока не закроется контекст приложения?

Не могли бы вы уточнить это, пожалуйста?

1 Ответ

0 голосов
/ 31 августа 2018

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