Dans un haricot de printemps, est-il possible d'avoir une méthode d'arrêt qui peut utiliser des transactions?

Dans la méthode destroy d'un ressort de haricots je veux exécuter des requêtes pour nettoyer certaines choses dans la base de données. Le printemps ne semble pas permettre par tous les moyens que je peux trouver.

L'erreur est toujours quelque chose comme:

Invocation de la méthode destroy échoué sur
bean avec le nom "someBean':
org.springframework.les haricots.usine.BeanCreationNotAllowedException:
Erreur lors de la création de haricots avec le nom
la "transactionManager": le Singleton bean
création qui n'est pas permis à tout le
les singletons de cette usine sont en
destruction (Ne demande pas un haricot
à partir d'un BeanFactory dans une méthode destroy
la mise en œuvre!)

La suite dira printemps à l'appel shutdownDestroy après le haricot n'est plus nécessaire. Mais, j'obtiens l'erreur ci-dessus lorsque vous essayez d'utiliser les transactions.

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

La même chose est vraie quand j'active courantes du cycle de vie des annotations à l'aide de:

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

puis marquez la méthode avec @PreDestroy. Cette méthode ne peut pas utiliser les transactions.

Est-il possible de faire cela?

EDIT:
Merci! J'ai eu la fève de mettre en œuvre SmartLifecycle et par adjonction, et il fonctionne très 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;
}

source d'informationauteur HappyEngineer