在spring bean中是否可以使用可以使用事务的shutdown方法?

Hap*_*eer 13 spring shutdown

在spring bean的destroy方法中,我想执行一些查询来清理数据库中的一些东西.Spring似乎无法以任何方式找到它.

错误始终如下:

破坏方法的调用上的名字豆失败"someBean":org.springframework.beans.factory.BeanCreationNotAllowedException:错误创建名为"transactionManager的"豆:辛格尔顿bean创建时不允许使用这家工厂的单身人士都在破坏(不要求在destroy方法实现中来自BeanFactory的bean!)

以下将告诉spring在不再需要bean之后调用shutdownDestroy.但是,我在尝试使用事务时遇到上述错误.

<bean id="someId" name="someName" class="someClass"
 destroy-method="shutdownDestroy"/>
Run Code Online (Sandbox Code Playgroud)

使用以下命令启用公共生命周期注释时也是如此:

<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>
Run Code Online (Sandbox Code Playgroud)

然后用方法标记方法@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;
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 14

有趣的问题.我想你应该可以通过让你的bean实现SmartLifeCycle它来做到这一点.

这样,如果你的int getPhase();方法返回Integer.MAX_VALUE,它将是ApplicationContext最后关闭时被调用的第一个.

参考: