Spring @PreDestroy方法

时间:2013-12-10 06:30:35

标签: spring spring-ioc

我发现@PreDestroy仅适用于singleton范围内的bean。我在想如果我们将它与prototype范围的bean一起使用会出现什么问题。什么都没有?我不这么认为。我认为这只是在春天没有实现,因为他们必须保持对所有创建的bean的引用。告诉我,如果我错了

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

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

与其他范围相比,Spring不管理a的完整生命周期 原型bean:容器实例化,配置和组装a 原型对象,并将其交给客户端,没有该原型的进一步记录 实例。

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

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

答案 2 :(得分:0)

@PreDestroy注释不属于Spring,它位于J2ee库 - common-annotations.jar中。

默认情况下,Spring不会知道@PreDestroy注释。要启用它,您必须注册'CommonAnnotationBeanPostProcessor'或在bean配置文件中指定''