关于春豆容器的范围和垃圾收集

2022-09-02 00:49:32

我是Spring的新手,目前正在我的一个项目中使用它。我了解到Spring容器包含所有豆子,并且默认情况下所有豆子的范围都是。我可以在文件中或使用注释更改范围。我进一步了解到,如果一个类有范围,Spring容器将在需要时实例化该类的新对象。"singleton"application-context.xml@Scope"prototype"

我不明白的是:如何处理垃圾回收。如果不再需要创建的对象,它们是否会被垃圾回收,或者它们是否仍保留在容器中。显然,我不希望创建和保留许多对象以保持较低的内存使用率。


答案 1

来自Spring文档(3.5.2原型范围):

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

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

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

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

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


答案 2

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

如果没有其他东西引用该豆(粗略地),则它有资格获得GC。