我是春天新手,我目前正在其中一个项目中使用它。我了解到spring容器包含所有bean,默认情况下所有bean的范围都是singleton。我可以在application-context.xml中或使用annptation @scope更改范围。
现在我的问题是,如果将类的范围作为“原型”,则弹簧容器将在每次需要时实例化一个新对象...对吗?现在,如何处理垃圾收集。如果对象不再使用,或者它仍然悬挂在容器中,它们是否会被垃圾收集。因为我不希望每次需要创建很多对象并加载内存。
有人帮我理解这个。 感谢。答案 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的条件。