【问题标题】:Spring Prototype Beans and Benefits of SpringSpring Prototype Beans 和 Spring 的好处
【发布时间】:2012-06-12 22:51:37
【问题描述】:

我已经逐渐掌握 Spring 有一段时间了,并且认为我对这些概念有一个合理的想法,但是我在另一个线程中遇到了一些信息,这让我的事情发生了翻天覆地的变化......

"...虽然初始化生命周期回调方法会在所有对象上调用而不考虑范围,但在原型的情况下,不会调用配置的销毁生命周期回调。客户端代码必须清理原型范围的对象并释放昂贵的资源原型 bean 正在持有。要让 Spring 容器释放原型范围 bean 持有的资源,请尝试使用自定义 bean 后处理器,它包含对需要清理的 bean 的引用。"

这让我想到我有真正的用例,我想使用原型 bean,例如,每个请求我需要一个“新”bean 实例。但是,根据我对这个 sn-p 的理解(来自 Spring 3 文档),Spring 保留对需要清理的 bean 的引用(引用本身意味着垃圾收集器不会自动清除 bean)。此外,我认为原型 bean 持有的资源必须手动清理。

有人可以告诉我这是否正确吗?如果是这样,是否有用于处理此问题的典型模式?我很感激能描述 Spring 以这种方式实现原型 bean 的架构原因的答案。

【问题讨论】:

  • 如果您需要按请求限定范围,您可以使用请求范围;)static.springsource.org/spring/docs/3.0.0.M3/…
  • @Spaeth 抱歉,我可能误导了...这不是一个 Web 应用程序,我只是想证明需要创建一个新实例来处理发生的“某事”

标签: java spring architecture garbage-collection


【解决方案1】:

Spring 保留对需要清理的 bean 的引用(引用本身意味着 bean 不会被垃圾收集器自动清除)。

是的,但容器不包含对原型范围 bean 的引用。这就是为什么不调用销毁回调的原因:Spring 创建 bean 实例,连接它并调用构造回调。它给出了一个实例并忘记了那个 bean。

您可以安全地为每个请求创建原型范围的 bean。 Spring 会给你一个实例,当你没有对该 bean 的任何引用时(Spring 没有保留一个!),它将被垃圾收集。但是由于 Spring 在创建 bean 后对它一无所知 - 它不能调用任何销毁回调。事实上,这归结为一个问题:为什么 Java 没有析构函数。

那么如何清理原型范围的 bean?好吧,就像你在 Java 中清理任何其他资源一样——明确地。提供close()destroy()stop() 或任何您喜欢的名称(考虑实现Closeable。请注意,通常不需要此类方法。垃圾收集器将释放整个对象图,而数据库连接等持久资源将被释放当整个 DataSource 关闭时关闭。

【讨论】:

  • 感谢您的回答...这是我在阅读此 sn-p 之前相信它的工作方式,也许我只是误解了它!基本上……像以前一样继续,留下毁灭的痕迹,我身后的一切都会被清理干净:-)
  • 能否提供有关此的任何文档参考,只是想确定
  • "Spring 不管理原型 bean 的完整生命周期:容器实例化、配置、装饰和以其他方式组装原型对象,将其交给客户端,然后不再了解该原型实例. " docs.spring.io/spring/docs/3.0.0.M3/spring-framework-reference/…
【解决方案2】:

您误读了文档。它明确地说:

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

所以 Spring 不包含对其创建的原型 bean 的任何引用。如果需要,您可以创建一个 bean 后处理器来保存对这些 bean 的引用。

此外,原型 bean 很少有必须清理的资源。例如,连接池(需要在关闭时正确销毁)通常是单例 bean。把它做成原型没有多大意义。由于原型 bean 经常使用很短的时间,创建它的客户端可以在不再使用它时显式地释放它的资源。就像你创建一个新的流或连接,然后在 finally 块中关闭它一样。

【讨论】:

    【解决方案3】:

    Spring 不知道使用原型作用域创建的所有实例。它将简单地实例化和配置原型范围的 bean,然后按照文档中的说明将其交给客户端。

    Spring 不管理原型 bean 的完整生命周期: 容器实例化、配置、装饰和以其他方式组装 一个原型对象,把它交给客户,然后就没有了 该原型实例的知识。

    http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html#beans-factory-scopes-prototype

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2011-05-08
      • 2015-03-02
      • 2023-03-03
      • 1970-01-01
      • 2013-08-20
      • 2013-02-12
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多