我是spring框架的新手。当使用singleton执行程序为true并在xml文件中指定销毁方法时,将执行指定的销毁方法,但当singleton为false时,它不会执行。
在google中搜索时,我发现spring不能管理非单例bean的整个生命周期。那么我们如何销毁该bean,以及spring不能管理非单例bean的完整生命周期的原因是什么。
提前谢谢。
发布于 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跟踪很多对象,这可能会占用宝贵的内存。
当然还有其他潜在的问题,可能有太多的问题无法在这里列出,所以我就到此为止。
发布于 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方法,则它必须保留对每个副本的引用。这将产生令人不快的内存消耗。
https://stackoverflow.com/questions/14162621
复制相似问题