2

我发现@PreDestroy只能使用singleton作用域 bean。我在想如果我们将它与prototype作用域 bean 一起使用会出现什么问题。什么都有???我不这么认为。我认为这只是在 spring 中没有实现,因为他们必须保留对所有创建的 bean 的引用。告诉我我是否错了

4

3 回答 3

4

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

于 2013-12-10T07:16:24.860 回答
1

@PreDestroy注解不属于 Spring,它位于package下的jsr250-apilibrary jar中。javax.annotation

默认情况下,Spring 不会意识到@PreDestroy注解。要启用它,您必须注册CommonAnnotationBeanPostProcessor或指定<context:annotation-config />in bean XML 配置文件。

于 2013-12-10T06:35:31.567 回答
1

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

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

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-scopes-prototype

与其他作用域相比,Spring 不管理原型 bean 的完整生命周期:容器实例化、配置和以其他方式组装原型对象,并将其交给客户端,而无需进一步记录该原型实例。

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

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

于 2017-06-05T13:22:30.047 回答