每次我们编写 getBean() 时,Spring 中都会创建一个对象吗?

Sus*_*ant -4 spring object inversion-of-control

我读到,每当我们在 spring 中执行 getBean() 时,它都会返回所需的对象。那么这是否意味着,如果我调用 getBean() 1000 次,就会创建 1000 个对象?如果是,那么 Spring 如何管理这些对象?如果否,请解释一下 Spring 如何在对象创建方面工作?有对象池之类的概念吗?请澄清我的疑问。我对 spring 很陌生,很困惑创建 spring 框架是为了让我们的任务变得简单还是让事情变得更复杂。Spring 似乎是一个 XML 网络 :(

Nán*_*ete 5

来自关于单例 bean 工厂范围的 Spring 框架文档

单例范围

仅管理单例 bean 的一个共享实例,并且对具有与该 bean 定义匹配的 id 或 id 的 bean 的所有请求都会导致 Spring 容器返回一个特定的 bean 实例。

换句话说,当您定义一个 bean 定义并将其范围限定为单例时,Spring IoC 容器将创建由该 bean 定义定义的对象的一个​​实例。该单个实例存储在此类单例 bean 的缓存中,并且该命名 bean 的所有后续请求和引用都会返回缓存的对象。

总而言之,不,Spring 只会在 bean 工厂中创建每个 bean 的单个实例,除非您将singleton的默认作用域更改为其他 bean 作用域。

其他 bean 范围包括:

Bean 范围

单例
(默认)将单个 bean 定义范围限定为每个 Spring IoC 容器的单个对象实例。

原型
将单个 bean 定义的范围限定为任意数量的对象实例。

要求
将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期;也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的基础上创建的。仅在 Web 感知的 Spring ApplicationContext 上下文中有效。

会议
将单个 bean 定义的范围限定为 HTTP 会话的生命周期。仅在 Web 感知的 Spring ApplicationContext 上下文中有效。

全球会议
将单个 bean 定义的范围限定为全局 HTTP 会话的生命周期。通常仅在 portlet 上下文中使用时才有效。仅在 Web 感知的 Spring ApplicationContext 上下文中有效。