Java singleton为false时不执行Destroy方法

Java singleton为false时不执行Destroy方法,java,spring,Java,Spring,我不熟悉spring框架。当使用singleton执行程序时,如果为true,并在xml文件中指定销毁方法,则会执行指定的销毁方法,但如果singleton为false,则不会执行该方法 在谷歌搜索时,我在某处发现spring无法管理非单例bean的整个生命周期。那么,我们怎样才能破坏这个bean呢?为什么spring不能管理非单例bean的整个生命周期呢 提前感谢。来自第5.5.2节: 与其他作用域不同,Spring并不管理原型bean的整个生命周期:容器实例化、配置和以其他方式组装原型对象,

我不熟悉spring框架。当使用singleton执行程序时,如果为true,并在xml文件中指定销毁方法,则会执行指定的销毁方法,但如果singleton为false,则不会执行该方法

在谷歌搜索时,我在某处发现spring无法管理非单例bean的整个生命周期。那么,我们怎样才能破坏这个bean呢?为什么spring不能管理非单例bean的整个生命周期呢

提前感谢。

来自第5.5.2节:

与其他作用域不同,Spring并不管理原型bean的整个生命周期:容器实例化、配置和以其他方式组装原型对象,并将其交给客户机,而没有该原型实例的进一步记录。因此,尽管对所有对象调用初始化生命周期回调方法,而不考虑范围,但对于原型,不会调用配置的销毁生命周期回调。客户机代码必须清理原型范围的对象,并释放原型bean所持有的昂贵资源。要让Spring容器释放原型范围的bean所持有的资源,请尝试使用定制的bean后处理器,该后处理器持有对需要清理的bean的引用

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

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


再仔细想想,我想这是有道理的。如果多次调用该方法,您将始终收到bean的新副本。如果要在容器关闭时调用每个副本的dispose方法,Spring容器必须保留对每个副本的引用。这会造成不愉快的内存消耗。

如果bean是Spring
单例,那么每次您请求它时,Spring都会给您相同的一个。因此,Spring必须始终在这个bean上保留一个句柄,因此Spring可以在
ApplicationContext
关闭时销毁它

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

现在,您可能会问,为什么Spring不保留从非单例范围创建的bean的列表?嗯,一个问题是内存。如果这是一个长期存在的应用程序,有大量的请求创建了许多
原型
作用域bean,那么我们可以看到Spring跟踪了许多对象,这可能会占用宝贵的内存

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