В методе уничтожения Spring Bean я хочу выполнить несколько запросов, чтобы очистить некоторые вещи в базе данных. Похоже, Spring не позволяет этого ни при каких обстоятельствах.
Ошибка всегда что-то вроде:
Не удалось вызвать метод уничтожения
bean с именем 'someBean':
org.springframework.beans.factory.BeanCreationNotAllowedException:
Ошибка создания бина с именем
'actionManager ': компонент Singleton
создание не допускается, пока
синглтоны этой фабрики находятся в
уничтожение (не запрашивать боб
из BeanFactory в методе уничтожения
реализация!)
Следующая команда скажет Spring вызывать shutdownDestroy после того, как bean-компонент больше не нужен. Но я получаю вышеуказанную ошибку при попытке использовать транзакции.
<bean id="someId" name="someName" class="someClass"
destroy-method="shutdownDestroy"/>
То же самое верно, когда я включаю общие аннотации жизненного цикла, используя:
<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>
, а затем пометьте метод с помощью @PreDestroy
. Этот метод также не может использовать транзакции.
Есть ли способ сделать это?
EDIT:
Спасибо! У меня был bean-компонент, реализующий SmartLifecycle и добавляющий следующее, и он работает очень хорошо.
private boolean isRunning = false;
@Override
public boolean isAutoStartup() {return true;}
@Override
public boolean isRunning() {return isRunning;}
/** Run as early as possible so the shutdown method can still use transactions. */
@Override
public int getPhase() {return Integer.MIN_VALUE;}
@Override
public void start() {isRunning = true;}
@Override
public void stop(Runnable callback) {
shutdownDestroy();
isRunning = false;
callback.run();
}
@Override
public void stop() {
shutdownDestroy();
isRunning = false;
}