在 Spring Bean 的 destroy 方法中,我想执行一些查询以清除数据库中的一些东西。似乎Spring不允许通过任何我能找到的方式来实现这一点。
错误总是类似于:
'某些Bean' 上调用 destroy 方法失败: org.springframework.beans.factory.BeanCreationNotAllowedException: 在单例工厂销毁时不允许创建 'transactionManager' bean(不要在 destroy 方法实现中从 BeanFactory 请求bean!)
以下代码将告诉 Spring 在 Bean 不再需要时调用 shutdownDestroy。但是,在尝试使用事务时,我会遇到上述错误。
错误总是类似于:
'某些Bean' 上调用 destroy 方法失败: org.springframework.beans.factory.BeanCreationNotAllowedException: 在单例工厂销毁时不允许创建 'transactionManager' bean(不要在 destroy 方法实现中从 BeanFactory 请求bean!)
以下代码将告诉 Spring 在 Bean 不再需要时调用 shutdownDestroy。但是,在尝试使用事务时,我会遇到上述错误。
<bean id="someId" name="someName" class="someClass"
destroy-method="shutdownDestroy"/>
当我使用以下方式启用常见的生命周期注释时,情况也是如此:
<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>
然后使用@PreDestroy
标注该方法。此方法也不能使用事务。
有没有其他方法可以做到这一点?
编辑: 谢谢!我让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;
}