Spring Bean 的作用域详解


💖The Begin💖点点关注,收藏不迷路💖

本文将详细介绍 Spring 支持的五种主要 Bean 作用域。

1. Singleton(单例模式)

定义:Singleton 是 Spring 容器中最常用的作用域,也是默认的作用域。在 Singleton 作用域下,Spring 容器中的每个 Bean 定义都对应着容器中的一个实例。无论请求多少次,容器都只会返回这个唯一的实例。

特点:

  • 容器启动时创建实例。
  • 容器关闭时销毁实例(如果配置了相应的销毁方法)。
  • 适用于无状态或有状态但状态可以共享的服务对象,如数据库连接池等。

示例:

<bean id="myBean" class="com.example.MyBean" scope="singleton"/>  
<!-- 或者省略 scope 属性,因为 singleton 是默认值 -->  
<bean id="myBean" class="com.example.MyBean"/>

2. Prototype(多例模式)

定义:Prototype 作用域下的 Bean,每次通过 Spring 容器获取时都会创建一个新的实例。这意味着,同一个 Bean 定义可以有多个实例,且它们之间互不影响。

特点:

  • 容器不会提前创建实例,而是在每次请求时创建。
  • 实例的生命周期由调用者管理,容器不负责销毁。
  • 适用于有状态且状态不可共享的服务对象,如用户会话信息等。

示例:

<bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype"/>

3. Request(请求作用域)

定义:Request 作用域仅在 Web 应用中有效,它确保每个 HTTP 请求都有自己独立的 Bean 实例。

特点:

  • 适用于与 HTTP 请求相关的数据,如请求参数、用户信息等。
  • 容器在请求开始时创建实例,请求结束时销毁实例(依赖于 Servlet 容器)。

示例(在 Spring MVC 中配置):

@Bean  
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)  
public MyRequestBean myRequestBean() {  
    return new MyRequestBean();  
}

注意:由于 XML 配置中直接设置 Request 作用域较为复杂,通常通过注解或 Java 配置方式在 Web 应用中使用。

4. Session(会话作用域)

定义:Session 作用域同样仅在 Web 应用中有效,它确保每个 HTTP Session 都有自己的 Bean 实例。

特点:

  • 适用于需要跨多个请求保持状态的情况,如用户购物车等。
  • 容器在 Session 开始时创建实例,Session 结束时销毁实例(依赖于 Servlet 容器)。

示例(通过注解配置):

@Bean  
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)  
public MySessionBean mySessionBean() {  
    return new MySessionBean();  
}

5. GlobalSession(全局会话作用域)

定义:GlobalSession 作用域是特定于 Portlet 环境的,它类似于 Session 作用域,但用于 Portlet 应用的跨 Portlet 会话共享。在标准的 Servlet 环境中,GlobalSession 和 Session 是一样的。

特点:

  • 主要用于 Portlet 环境中,确保跨 Portlet 会话的数据共享。
  • 容器在全局会话开始时创建实例,全局会话结束时销毁实例。

示例(较少使用):

// 假设性示例,实际上在Servlet环境中不会这样使用  
@Bean  
@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)  
public MyGlobalSessionBean myGlobalSessionBean() {  
    return new MyGlobalSessionBean();  
}  
  
// 注意:WebApplicationContext.SCOPE_GLOBAL_SESSION 并不是Spring标准API的一部分,  
// 这里仅用于说明如何假设性地配置GlobalSession作用域(实际上应使用Portlet特定的API或配置方式)

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值