¿En un bean de primavera es posible tener un método de apagado que pueda usar transacciones?

En el método de destrucción de un bean spring quiero ejecutar algunas consultas para limpiar algunas cosas en la base de datos. Spring no parece permitir esto de ninguna manera que pueda encontrar.

El error siempre es algo como:

La invocación del método de destrucción falló en el bean con el nombre 'someBean': org.springframework.beans.factory.BeanCreationNotAllowedException: Error al crear el bean con el nombre 'transactionManager': no se permite la creación de beans Singleton mientras los singletons de esta fábrica están en destrucción (No ¡solicite un bean de BeanFactory en una implementación del método de destrucción!)

Lo siguiente le dirá a spring que llame a shutdownDestroy después de que el bean ya no sea necesario. Pero recibo el error anterior cuando intento usar transacciones.

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

Lo mismo ocurre cuando habilito las anotaciones comunes del ciclo de vida usando:

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

y luego marque el método con@PreDestroy. Ese método tampoco puede usar transacciones.

¿Hay alguna forma de hacer esto?

EDIT: ¡Gracias! Hice que Bean implemente SmartLifecycle y agregue lo siguiente y funciona muy bien.

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;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta