【问题标题】:Spring @PreDestroy methodSpring @PreDestroy 方法
【发布时间】:2013-12-10 06:30:35
【问题描述】:

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

【问题讨论】:

    标签: spring spring-ioc


    【解决方案1】:

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

    【讨论】:

    • 正确,但是为什么它们的生命周期不是由 spring 管理的,因为 spring 一开始就创建了它。
    • 因为 spring 无法知道对象的生命何时结束。它知道生命何时开始但不知道何时结束,因此是未定义的生命周期(与明确定义的单例、请求、会话范围的 bean 不同)。
    【解决方案2】:

    对于“原型”作用域的 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 的引用。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您提供的信息,但这不是重点。关键是它由弹簧容器处理,为什么它不调用非单例bean。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多