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

rav*_*avi 15 java spring garbage-collection

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

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

有人帮我理解这个.谢谢.

Tom*_*icz 31

从Spring文档(3.5.2原型范围):

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

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

void bar() {
  Object foo = ctx.getBean("foo")
}
Run Code Online (Sandbox Code Playgroud)

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

因此,尽管无论范围如何都在所有对象上调用初始化生命周期回调方法,但在原型的情况下,不会调用已配置的销毁生命周期回调.


Dav*_*ton 4

容器不保留对实例化 Bean 的引用,而使用它们的代码则保留。

如果没有其他东西(大致)引用该 bean,则它有资格进行 GC。