首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当singleton为false时,销毁方法不执行

当singleton为false时,销毁方法不执行
EN

Stack Overflow用户
提问于 2013-01-05 02:17:35
回答 2查看 1.2K关注 0票数 2

我是spring框架的新手。当使用singleton执行程序为true并在xml文件中指定销毁方法时,将执行指定的销毁方法,但当singleton为false时,它不会执行。

在google中搜索时,我发现spring不能管理非单例bean的整个生命周期。那么我们如何销毁该bean,以及spring不能管理非单例bean的完整生命周期的原因是什么。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-01-05 02:27:45

如果一个singleton是一个Spring,那么每次你请求它时,Spring都会给你同样的bean。正因为如此,Spring必须始终保持对此bean的句柄,因此Spring可以在ApplicationContext关闭时销毁它。

如果一个singleton不是Spring,那么每次您请求一个bean时,都会得到一个新的实例(具有相同的配置)。由于Spring不需要保留这些bean,它们不会保留它们的句柄,并且没有句柄,它们如何在ApplicationContext关闭时调用方法来销毁它们呢?他们不能。

现在,您可能会问,为什么Spring不保留从非单例作用域创建的bean的列表?好吧,其中一个问题是记忆力。如果这是一个长寿的应用程序,有许多请求创建了许多prototype作用域beans,那么我们可以看到Spring跟踪很多对象,这可能会占用宝贵的内存。

当然还有其他潜在的问题,可能有太多的问题无法在这里列出,所以我就到此为止。

票数 2
EN

Stack Overflow用户

发布于 2013-01-05 02:26:41

reference documentation的第5.5.2节中:

与其他作用域不同,

不管理原型bean的整个生命周期:容器实例化、配置和组装原型对象,并将其交给客户端,而不需要进一步记录该原型实例。因此,尽管初始化生命周期回调方法在所有对象上都会被调用,但在原型的情况下,不会调用配置的销毁生命周期回调。客户端代码必须清理原型作用域的对象,并释放原型bean所持有的昂贵资源。要让Spring容器释放由prototype作用域的bean持有的资源,请尝试使用定制bean后处理器,它持有对需要清理的bean的引用。

在某些方面,Spring容器在原型作用域bean中的角色是Java new操作符的替代。超过该点的所有生命周期管理都必须由客户端处理。(有关Spring容器中bean的生命周期的详细信息,请参阅第5.6.1节“生命周期回调”。)

所以原因是他们决定在使用原型时不处理破坏。也许他们发现如果允许的话,可能会出现意想不到的问题。所以我很抱歉地说,你必须自己处理破坏。

多想一想,我想这是有道理的。如果您多次调用该方法,您将始终收到bean的新副本。如果Spring Container要在容器关闭时调用每个副本的dispose方法,则它必须保留对每个副本的引用。这将产生令人不快的内存消耗。

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

https://stackoverflow.com/questions/14162621

复制
相关文章

相似问题

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