关于Spring bean容器中的范围和垃圾收集

时间:2011-12-07 16:45:30

标签: java spring garbage-collection

我是春天新手,我目前正在其中一个项目中使用它。我了解到spring容器包含所有bean,默认情况下所有bean的范围都是singleton。我可以在application-context.xml中或使用annptation @scope更改范围。

现在我的问题是,如果将类的范围作为“原型”,则弹簧容器将在每次需要时实例化一个新对象...对吗?现在,如何处理垃圾收集。如果对象不再使用,或者它仍然悬挂在容器中,它们是否会被垃圾收集。因为我不希望每次需要创建很多对象并加载内存。

有人帮我理解这个。 感谢。

2 个答案:

答案 0 :(得分:27)

从Spring文档(3.5.2 The prototype scope):

  

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

简单地说 - 一旦你创建并获得对prototype作用域bean的引用,它就是JVM中唯一存在的引用。一旦这个引用超出范围,该对象将被垃圾收集:

void bar() {
  Object foo = ctx.getBean("foo")
}

当您离开bar()方法时,没有任何其他对foo新实例的引用,这意味着它有资格进行垃圾回收。该模型的结果是:

  

因此,虽然无论范围如何都在所有对象上调用初始化生命周期回调方法,但在原型的情况下,配置的销毁生命周期回调被调用。

答案 1 :(得分:2)

容器不会保留对实例化bean的引用,使用它们的代码会这样做。

如果没有其他东西(粗略地)引用bean,则它符合GC的条件。