onApplicationEvent будет вызываться до уничтожения bean-компонента, вы можете проверить его в методе Spring org.springframework.context.support.AbstractApplicationContext # doClose. Я вставляю его ниже, поэтому ContextEvent -> LifeCycle -> Bean destory.

оде уничтожения Spring Bean я хочу выполнить несколько запросов, чтобы очистить некоторые вещи в базе данных. Кажется, весна не позволяет этого ни при каких обстоятельствах.

Ошибка всегда что-то вроде:

Сбой вызова метода уничтожения для компонента с именем 'someBean': org.springframework.beans.factory.BeanCreationNotAllowedException: Ошибка при создании компонента с именем'actionManager ': создание компонента Singleton не допускается, пока синглтон этой фабрики находится в процессе уничтожения (Не запрашивать бин из BeanFactory в реализации метода уничтожения!)

Далее будет сказано, что весна должна вызывать shutdownDestroy после того, как bean-компонент больше не нужен. Но я получаю вышеуказанную ошибку при попытке использовать транзакции.

<bean id="someId" name="someName" class="someClass"
 destroy-method="shutdownDestroy"/>

То же самое верно, когда я включаю общие аннотации жизненного цикла, используя:

<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>

а затем пометьте метод с помощью@PreDestroy, Этот метод также не может использовать транзакции.

Есть какой-либо способ сделать это?

РЕДАКТИРОВАТЬ: Спасибо! У меня был компонент, реализующий 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;
}

Ответы на вопрос(2)

Ваш ответ на вопрос