掌握 Spring IoC 容器与 Bean 作用域:详解 singleton 与 prototyp


在 Spring 中,IoC(Inversion of Control)容器负责管理应用程序中的对象(称为 Bean),并通过依赖注入将它们组装起来。Bean 的作用域定义了 Bean 对象的生命周期和可见范围。在 Spring 中,最常见的作用域是 singleton 和 prototype。

Singleton 作用域

在 singleton 作用域下,IoC 容器中的每个 Bean 都只有一个实例,该实例在容器启动时创建,并在整个应用程序生命周期内存在。

配置示例:

<bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton"/>
import org.springframework.stereotype.Component;

@Component
public class MySingletonBean {
    // Bean 的属性和方法
}

Prototype 作用域

在 prototype 作用域下,每次请求 Bean 时,IoC 容器都会创建一个新的实例。每个实例在创建后就被返回给调用者,且不会被容器所管理。

配置示例:

<bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype"/>
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
public class MyPrototypeBean {
    // Bean 的属性和方法
}

区别与用法

  • Singleton 作用域适用于那些在整个应用程序中只需要一个实例的 Bean,例如数据库连接池、日志处理器等。在 singleton 作用域下,Spring IoC 容器会创建 Bean 的单个实例,并在需要时共享给所有请求它的对象。
  • Prototype 作用域适用于那些每次请求时都需要创建一个新实例的 Bean,例如 HTTP 请求处理器、线程池等。在 prototype 作用域下,Spring IoC 容器会创建一个新的 Bean 实例,并在每次请求时返回该实例。

注意事项

  • 使用 singleton 作用域时,应确保 Bean 是线程安全的,因为它会在多个线程中共享。
  • 使用 prototype 作用域时,应注意 Bean 的生命周期管理,Spring 不会对 prototype Bean 进行销毁和资源回收,需要手动进行管理。

选择适合的作用域是根据你的业务需求和应用程序的特点来决定的。在配置时要谨慎选择,并确保理解每种作用域的含义和影响。


原文链接:codingdict.net