DP_*_*DP_ 10 java spring java-ee
我有一个Spring bean定义beans.xml如下:
<context:annotation-config />
[...]
<bean id="myBackend" class="mycompany.BackendBean" scope="singleton" />
Run Code Online (Sandbox Code Playgroud)
bean内部有两个方法,必须在Web应用程序的开始和结束之前执行:
public class BackendBean implements IBackend {
private static final Logger LOGGER = LoggerFactory
.getLogger(BackendBean.class);
@PostConstruct
public void init()
{
LOGGER.debug("init");
}
@PreDestroy
public void destroy()
{
LOGGER.debug("destroy");
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行server(mvn jetty:run)时,我可以init在控制台中看到该方法的输出,从中我得出结论该init方法已执行.
当我按下Ctrl-C并且Jetty开始关闭时,我看不到destroy方法的输出.
destroy当应用程序终止时,为了执行该方法,我应该更改什么?
Abh*_*kar 13
对于Spring @PreDestroy在应用程序关闭时调用回调方法,您必须添加一个关闭钩子并关闭它所在的应用程序上下文.Runtime.getRuntime().addShutdownHook(Thread)如果它提供了这样的API,您可以使用或将挂钩附加到JVM .以下是使用JVM关闭钩子的方法:
final ApplicationContext appContext = ... // create your application context
// using one of the various application context classes
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
appContext.close();
}});
Run Code Online (Sandbox Code Playgroud)
小智 5
当您在班级中使用@PreDestroy 时,即使您尝试使用或@Scope("prototype")关闭,@PreDestroy 也不起作用context.close();context.registerShutdownHook();
这是您需要注意“原型”作用域 bean 的一个微妙点。
对于“原型”作用域 bean,Spring 不会调用 @PreDestroy 方法。
这是 Spring 官方参考手册中的答案:
第 1.5.2 节(请参阅此处)
与其他 scope 相比,Spring 不管理原型 bean** 的完整生命周期:容器实例化、配置和以其他方式组装原型对象,并将其交给客户端,没有该原型实例的进一步记录.
因此,尽管在所有对象上调用初始化生命周期回调方法,而不管范围如何,但在原型的情况下,不会调用配置的销毁生命周期回调。客户端代码必须清理原型范围的对象并释放原型 bean 持有的昂贵资源。
要让 Spring 容器释放原型作用域 bean 持有的资源,请尝试使用自定义 bean post-processor,它保存对需要清理的 bean 的引用。
注意:这也适用于 XML 配置。
| 归档时间: |
|
| 查看次数: |
14813 次 |
| 最近记录: |