Spring 弹簧@PreDestroy法

Spring 弹簧@PreDestroy法,spring,spring-ioc,Spring,Spring Ioc,我发现@PreDestroy只适用于单例作用域bean。我在想,如果我们将它与prototype作用域bean一起使用,会出现什么问题。有什么事吗???我不这么认为。我认为这只是没有在spring中实现,因为他们必须保留对所有创建bean的引用。如果我错了,请告诉我,@PreDestroy注释不属于Spring,它位于javax.annotation包下的jsr250 api库jar中 默认情况下,Spring不会意识到@PreDestroy注释。要启用它,您必须注册CommonAnnotati

我发现
@PreDestroy
只适用于
单例
作用域bean。我在想,如果我们将它与
prototype
作用域bean一起使用,会出现什么问题。有什么事吗???我不这么认为。我认为这只是没有在spring中实现,因为他们必须保留对所有创建bean的引用。如果我错了,请告诉我,
@PreDestroy
注释不属于Spring,它位于
javax.annotation
包下的
jsr250 api
库jar中


默认情况下,Spring不会意识到
@PreDestroy
注释。要启用它,您必须注册
CommonAnnotationBeanPostProcessor
,或者在BeanXML配置文件中指定

Spring只能初始化/销毁bean。它还包括控制器,基本上原型范围的bean不在Spring的控制之下(构建之后)。它不知道什么时候会被清理、销毁或者是什么时候。因此,
@PreDestroy
方法不能为原型bean调用(因为它们没有像单例bean或请求范围bean那样明确定义的生命周期)。

对于“原型”范围bean,Spring不调用@PreDestroy方法

以下是Spring参考手册中的答案。第7.5.2节

与其他作用域不同,Spring并不管理一个应用程序的整个生命周期 原型bean:容器实例化、配置和以其他方式组装 prototype对象,并将其交给客户机,而不再记录该原型 例如

因此,尽管对所有对象调用初始化生命周期回调方法,而不考虑范围,但对于原型,不会调用配置的销毁生命周期回调。客户机代码必须清理原型范围的对象,并释放原型bean所持有的昂贵资源


要让Spring容器释放原型范围的bean所拥有的资源,请尝试使用定制的bean后处理器,该处理器包含对需要清理的bean的引用。

感谢您提供的信息,但这不是重点。关键是它是由spring容器处理的,为什么不调用非单例bean.correct,但为什么它们的生命周期不是由spring管理的,因为spring无法知道对象生命周期何时结束。它知道生命何时开始,但不知道生命何时结束,因此是未定义的生命周期(与明确定义的单例、请求、会话范围的bean相反)。