当前位置: 首页 > news >正文

Spring 中的 bean 作用域

在 Spring 中,bean 的作用域(Scope)定义了 bean 的生命周期和可见范围。Spring 主要提供了以下几种作用域:

1. singleton(默认作用域)

  • 描述:每个 Spring 容器中,bean 只有一个实例,所有对该 bean 的请求都会返回同一个实例。
  • 适用场景:大多数 bean 适用于 singleton,如 ServiceRepository 等无状态的 bean
  • 示例
    @Bean
    @Scope("singleton")  // 也可以不写,默认就是 singleton
    public MyBean myBean() {
        return new MyBean();
    }
    

2. prototype

  • 描述:每次获取 bean 时,都会创建一个新的实例。
  • 适用场景:适用于有状态的 bean,如带有用户会话信息的 bean
  • 示例
    @Bean
    @Scope("prototype")
    public MyBean myBean() {
        return new MyBean();
    }
    
  • 注意
    • prototype 作用域的 bean 由 Spring 负责创建,但不负责管理其生命周期(例如不会自动销毁)。
    • 需要手动管理 bean 的销毁,比如使用 @PreDestroy 方法不会被 Spring 调用。

3. request(仅适用于 Web 应用)

  • 描述:每个 HTTP 请求都会创建一个新的 bean 实例,请求结束后 bean 被销毁。
  • 适用场景:适用于需要在请求范围内保存状态的 bean,如 Controller 层的 bean
  • 示例
    @Bean
    @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public MyBean myBean() {
        return new MyBean();
    }
    
  • 注意
    • 需要在 Spring Web 环境下使用,否则会抛出异常。

4. session(仅适用于 Web 应用)

  • 描述:每个 HTTP 会话(Session)都会创建一个 bean 实例,Session 结束后 bean 被销毁。
  • 适用场景:适用于需要在整个用户会话期间保存状态的 bean
  • 示例
    @Bean
    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public MyBean myBean() {
        return new MyBean();
    }
    

5. application(仅适用于 Web 应用)

  • 描述bean 的生命周期与 ServletContext 相同,即整个应用共享一个实例。
  • 适用场景:适用于全局配置 bean,如应用级别的 Cache
  • 示例
    @Bean
    @Scope(value = WebApplicationContext.SCOPE_APPLICATION)
    public MyBean myBean() {
        return new MyBean();
    }
    

6. websocket(仅适用于 WebSocket 应用)

  • 描述:每个 WebSocket 连接都会创建一个 bean 实例,连接关闭后 bean 被销毁。
  • 适用场景:适用于 WebSocket 连接的会话管理。
  • 示例
    @Bean
    @Scope(value = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public MyBean myBean() {
        return new MyBean();
    }
    

如何选择合适的作用域?

作用域适用场景
singleton无状态的、共享的 bean(默认值)
prototype需要每次创建新实例的 bean
request仅在一次 HTTP 请求中存活的 bean
session需要在整个会话期间存活的 bean
application需要在整个 Web 应用生命周期内共享的 bean
websocket需要在 WebSocket 连接期间存活的 bean

一般情况下,推荐使用 singleton 作用域,只有在特殊需求(如用户会话、线程安全等)时才考虑其他作用域。

相关文章:

  • [AI] 从Trellis AI 模型生成本地化部署到投入Pinokio怀抱
  • K8S学习之基础二十九:K8S中的secret
  • 数据结构------线性表
  • 使用VisualStdio制作上位机(一)
  • Java 多线程编程:提升系统并发处理能力!
  • 常见限流算法及实现
  • python练习2
  • Java集合 - HashMap
  • 基于银河麒麟系统ARM架构安装达梦数据库并配置主从模式
  • 编程语言的几种常见的分类方法
  • NET进行CAD二次开发之二
  • bgp服务器是什么意思
  • 4060ti-16G显卡部署deepseek-32B(支持联网搜索)
  • Touch panel功能不良分析
  • 深入解析 Latent Diffusion Model(潜在扩散模型,LDMs)(代码实现)
  • MSP430 Proteus 仿真作品
  • Linux驱动开发-①pinctrl 和 gpio 子系统②并发和竞争③内核定时器
  • 分类操作-05.修改分类
  • 239. 滑动窗口最大值
  • 浅谈AVL树插入的平衡调节
  • 高端大气网站欣赏/今日头条新闻消息
  • 中标查询/青岛seo招聘
  • wordpress 相册调用/自动app优化官网
  • wordpress上传html代码/网络营销中的seo是指
  • wordpress热词标签/关键词优化seo
  • 做暧电影在线观看网站/ 今日头条