在现实世界的应用程序中,销毁方法的可能用法是什么?为什么一个正在运行的应用程序要销毁它的bean呢?如果beans是由spring容器通过ContextLoaderListener为web应用程序创建的,那么如何重新创建这些beans,因为容器已经启动。有没有办法在不重启应用服务器的情况下重启spring IoC容器?
发布于 2016-04-23 09:18:34
一个例子是DataSource或任何需要清理的资源。你可能会有类似这样的东西:
@Bean(destroyMethod = "close")
DataSource dataSource() {
....
}这在具有多个类加载器的环境中可能特别重要,例如应用程序服务器,以防止内存泄漏。
有时这样做是多余的,因为底层资源可能会进行自己的清理(例如,作为servlet生命周期中contextDestroyed事件的一部分),但是您应该始终验证这一点。
这些spring docs也是一个有用的参考资料。这里引用的例子是类似的:
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>然后是bean类:
public class ExampleBean {
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}可以刷新上下文。此answer很好地解释了这一点,以及您可能想要在什么时候这样做。
发布于 2016-04-23 10:57:47
下面是我的观点:
在实际应用程序中使用destroy方法的可能示例是什么?
对于大多数应用来说,可能我们主要关注真实的业务,所以我们不会经常遇到需要定义销毁方法的场景。但是,当你遇到一些基本的组件或中间件时,你需要注意资源管理,如数据库连接,内存使用,磁盘使用等,你必须知道如何清楚地释放不必要的资源占用,否则会造成严重的问题。
如果beans是由ContextLoaderListener为web应用程序的spring容器创建的,那么如何重新创建这些beans,因为容器已经启动了?
Spring Container不仅仅适用于web应用程序,它还可以服务于常见的java应用程序(主应用程序)。Spring Container有两个不同的Bean Type(Singleton和Prototype),单例Bean只有在Spring Container完成启动时才会被预实例化,而原型Bean每次都会通过调用getBean来实例化。
有没有办法在不重启应用服务器的情况下重启spring IoC容器?
通过调用AbstractRefreshableApplicationContext.refresh()方法开始实例化Spring IoC容器。此方法将销毁整个Spring IoC容器,如果您之前已经实例化过容器的话。因此,您可以调用此方法来重新实例化容器。如果您想了解Spring,我建议您阅读的源代码:spring-core,spring-beans,spring-context.
希望能对您有所帮助。
发布于 2016-04-24 04:39:44
我在Spring应用程序中看到过直接或间接启动非守护进程线程的bean。然后,在不终止进程的情况下停止进程变得不可能。这影响了一些处理自动化测试的Jenkins工作。因此,现实世界中有很多示例,特别是在DevOps世界中
https://stackoverflow.com/questions/36805422
复制相似问题