java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Bean六种作用域

Spring Bean的六种作用域详解

作者:老神在在001

文章介绍了Spring框架中6种Bean作用域类型,包括singleton(单例,默认),prototype(原型)request(请求域)session(会话域)application(应用域)和websocket(WebSocket域),每种解释了作用域的核心效果、适用场景和代码示例,需要的朋友可以参考下

在 Spring 容器中,Bean 的作用域决定了 Bean 实例的创建规则、生命周期和使用范围,它会直接影响程序的性能、线程安全和内存占用。Spring 一共定义了 6 种作用域,下面我们逐一拆解。

一、singleton(单例,默认作用域)

核心效果

适用场景

代码示例

// 方式1:注解方式(默认就是 singleton,可以省略)
@Component
@Scope("singleton")
public class UserService {
}
// 方式2:XML 配置
<bean id="userService" class="com.example.service.UserService" scope="singleton"/>

二、prototype(原型 / 多例)

核心效果

适用场景

代码示例

@Component
@Scope("prototype")
public class OrderInfo {
    // 每个请求/线程都会拿到独立的 OrderInfo 实例
}

三、request(请求域)

核心效果

适用场景

代码示例

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestInfo {
    // 每个 HTTP 请求都会创建独立实例
}

注意:需要配合 proxyMode 使用,否则会出现依赖注入异常。

四、session(会话域)

核心效果

适用场景

代码示例

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserSession {
    // 每个用户会话都会创建独立实例
}

五、application(应用域)

核心效果

适用场景

代码示例

@Component
@Scope(value = "application", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class AppConfig {
    // 整个 Web 应用中唯一实例
}

六、websocket(WebSocket 域)

核心效果

适用场景

代码示例

@Component
@Scope(value = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class WebSocketSessionInfo {
    // 每个 WebSocket 会话创建独立实例
}

作用域对比总结表

作用域实例创建规则适用环境典型场景
singleton容器中仅 1 个实例所有环境Service、DAO、工具类
prototype每次获取都新建实例所有环境有状态的对象、非线程安全对象
request每个 HTTP 请求 1 个实例Web 环境请求上下文、请求临时数据
session每个用户 Session 1 个实例Web 环境用户登录信息、购物车
application整个 Web 应用 1 个实例Web 环境全局配置、应用级缓存
websocket每个 WebSocket 会话 1 个实例WebSocket 环境长连接会话状态

一、先搞懂:Bean 作用域到底是什么?

简单说,就是 Spring 给你创建的对象,是「共用一个」还是「每次都给新的」,以及能用多久。比如:

二、6 种作用域,一个一个讲

1. singleton(单例,默认)

大白话:整个程序里,大家共用同一个对象

2. prototype(多例 / 原型)

大白话:每次调用,都给你一个全新的对象

下面 4 种,只有做网页项目(Web 程序)才会用到,按「用多久」来分:

3. request(请求域)

大白话:一次网页请求,用一个对象

4. session(会话域)

大白话:一个用户的一次登录会话,用一个对象

5. application(应用域)

大白话:整个网站,所有人共用同一个对象

6. websocket(WebSocket 域)

大白话:一次 WebSocket 连接,用一个对象

三、给你划重点(作业要写的核心点)

表格

作用域一句话总结关键特点
singleton全程序共用 1 个默认、无状态对象用它
prototype每次调用给新的有状态对象用它
request一次请求用 1 个网页单次请求用
session一个用户会话用 1 个登录用户的会话数据
application全网站共用 1 个全局配置 / 统计数据
websocket一次 WebSocket 连接用 1 个长连接场景用

四、举个你能懂的对比

关键补充说明

  1. 线程安全问题
    • singleton 单例 Bean 是线程共享的,必须保证线程安全(不能保存可变的成员变量状态)。
    • prototype/request/session 等多实例 Bean,每个线程 / 请求 / 会话使用独立实例,天生线程安全。
  2. 性能与内存
    • singleton 实例全局复用,性能最高、内存占用最低。
    • 多实例作用域会频繁创建销毁对象,会增加内存和 GC 压力,仅在有状态场景下使用。
  3. 代理模式
    • request/session/application 等 Web 相关作用域,需要配合 @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) 使用,否则在注入 singleton Bean 时会出现依赖注入异常。

以上就是Spring Bean的六种作用域详解的详细内容,更多关于Spring Bean六种作用域的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文