首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring bean销毁方法

Spring bean销毁方法
EN

Stack Overflow用户
提问于 2016-04-23 09:02:25
回答 3查看 14.5K关注 0票数 4

在现实世界的应用程序中,销毁方法的可能用法是什么?为什么一个正在运行的应用程序要销毁它的bean呢?如果beans是由spring容器通过ContextLoaderListener为web应用程序创建的,那么如何重新创建这些beans,因为容器已经启动。有没有办法在不重启应用服务器的情况下重启spring IoC容器?

EN

回答 3

Stack Overflow用户

发布于 2016-04-23 09:18:34

一个例子是DataSource或任何需要清理的资源。你可能会有类似这样的东西:

代码语言:javascript
复制
@Bean(destroyMethod = "close")
DataSource dataSource() {
 ....
}

这在具有多个类加载器的环境中可能特别重要,例如应用程序服务器,以防止内存泄漏。

有时这样做是多余的,因为底层资源可能会进行自己的清理(例如,作为servlet生命周期中contextDestroyed事件的一部分),但是您应该始终验证这一点。

这些spring docs也是一个有用的参考资料。这里引用的例子是类似的:

代码语言:javascript
复制
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>

然后是bean类:

代码语言:javascript
复制
public class ExampleBean {

    public void cleanup() {
        // do some destruction work (like releasing pooled connections)
    }
}

可以刷新上下文。此answer很好地解释了这一点,以及您可能想要在什么时候这样做。

票数 4
EN

Stack Overflow用户

发布于 2016-04-23 10:57:47

下面是我的观点:

在实际应用程序中使用destroy方法的可能示例是什么?

对于大多数应用来说,可能我们主要关注真实的业务,所以我们不会经常遇到需要定义销毁方法的场景。但是,当你遇到一些基本的组件或中间件时,你需要注意资源管理,如数据库连接内存使用磁盘使用等,你必须知道如何清楚地释放不必要的资源占用,否则会造成严重的问题。

如果beans是由ContextLoaderListener为web应用程序的spring容器创建的,那么如何重新创建这些beans,因为容器已经启动了?

Spring Container不仅仅适用于web应用程序,它还可以服务于常见的java应用程序(主应用程序)。Spring Container有两个不同的Bean Type(SingletonPrototype),单例Bean只有在Spring Container完成启动时才会被预实例化,而原型Bean每次都会通过调用getBean来实例化。

有没有办法在不重启应用服务器的情况下重启spring IoC容器?

通过调用AbstractRefreshableApplicationContext.refresh()方法开始实例化Spring IoC容器。此方法将销毁整个Spring IoC容器,如果您之前已经实例化过容器的话。因此,您可以调用此方法来重新实例化容器。如果您想了解Spring,我建议您阅读的源代码:spring-core,spring-beans,spring-context.

希望能对您有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-04-24 04:39:44

我在Spring应用程序中看到过直接或间接启动非守护进程线程的bean。然后,在不终止进程的情况下停止进程变得不可能。这影响了一些处理自动化测试的Jenkins工作。因此,现实世界中有很多示例,特别是在DevOps世界中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36805422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档