Bean的作用域

简介: Bean 常见的 6 种作用域

目录

1.作用域定义

2.Bean 的 6 种作用域

singleton

prototype

request

session

application(了解)

websocket(了解)

单例作⽤域(singleton) VS 全局作⽤域(application)

3. 设置作⽤域


1.作用域定义

限定程序中变量的可⽤范围叫做作⽤域,或者说在源代码中定义变量的某个区域就叫做作⽤域。

⽽ Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式,⽐如 singleton 单例作⽤域,就表示 Bean 在整个 Spring 中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另⼀个⼈读取到的就是被修改的值。

2.Bean 的 6 种作用域

Spring 容器在初始化⼀个 Bean 的实例时,同时会指定该实例的作⽤域。Spring常见的有 6 种作⽤域,最后四种是基于 Spring MVC ⽣效的:

    1. singleton:单例作⽤域
    2. prototype:原型作⽤域(多例作⽤域)
    3. request:请求作⽤域
    4. session:会话作⽤域
    5. application:全局作⽤域
    6. websocket:HTTP WebSocket 作⽤域

    注意后 4 种状态是 Spring MVC 中的值,在普通的 Spring 项⽬中只有前两种

    singleton

      • 官⽅说明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
      • 描述:该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀对象。
      • 场景:通常⽆状态的Bean使⽤该作⽤域。⽆状态表示Bean对象的属性状态不需要更新
      • 备注:Spring默认选择该作⽤域

      prototype

        • 官⽅说明:Scopes a single bean definition to any number of object instances.
        • 描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例。
        • 场景:通常有状态的Bean使⽤该作⽤域

        request

          • 官⽅说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
          • 描述:每次http请求会创建新的Bean实例,类似于prototype
          • 场景:⼀次http的请求和响应的共享Bean
          • 备注:限定SpringMVC中使⽤

          session

            • 官⽅说明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
            • 描述:在⼀个http session中,定义⼀个Bean实例
            • 场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息
            • 备注:限定SpringMVC中使⽤

            application(了解)

              • 官⽅说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
              • 描述:在⼀个http servlet Context中,定义⼀个Bean实例
              • 场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息
              • 备注:限定SpringMVC中使⽤

              websocket(了解)

                • 官⽅说明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
                • 描述:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
                • 场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean。
                • 备注:限定Spring WebSocket中使⽤

                单例作⽤域(singleton) VS 全局作⽤域(application)

                  • singleton 是 Spring Core 的作⽤域;application 是 Spring Web 中的作⽤域;
                  • singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。

                  3. 设置作⽤域

                  使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,⽐如设置 Bean 的作⽤域,如下代码所示:

                  @Component
                  public class Users {
                   @Scope("prototype")
                   @Bean(name = "u1")
                   public User user1() {
                   User user = new User();
                   user.setId(1);
                   user.setName("Java"); // 【重点:名称是 Java】
                   return user;
                   }
                  }

                  image.gif

                  @Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式:

                    1. 直接设置值:@Scope("prototype")
                    2. 使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
                    相关文章
                    |
                    存储 Java
                    AQS(AbstractQueuedSynchronizer,队列同步器)源码解读
                    AQS(AbstractQueuedSynchronizer,队列同步器)源码解读
                    |
                    缓存 Java API
                    JVM 四种引用和使用场景
                    在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,Java 4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用。
                    420 0
                    |
                    4月前
                    |
                    人工智能 机器人 Linux
                    OpenClaw从零到精通保姆级图文教程:新人阿里云/本地秒级搭建+微信/QQ/钉钉/飞书接入与免费大模型API配置攻略
                    2026年,OpenClaw(曾用名Clawdbot,因Logo酷似小龙虾被网友亲切称为“小龙虾”)作为开源AI智能体领域的现象级框架,凭借“Local-First”的核心特性,彻底打破传统AI“只说不做”的局限,实现了“指令输入→AI规划→工具调用→任务落地”的完整闭环,成为个人与轻量团队提升效率的核心装备。其最具价值的功能的之一,便是能无缝接入微信、QQ、钉钉、飞书四大主流通讯工具,无需切换APP,仅通过日常聊天指令,就能让AI助手完成文件处理、日程管理、信息检索、代码生成、跨平台协同等各类任务,真正实现24小时待命、高效落地工作。
                    1091 3
                    |
                    7月前
                    |
                    监控 关系型数据库 MySQL
                    索引失效场景(阿里高频踩坑点)
                    MySQL索引可显著提升查询性能,但存在多种失效场景:数据类型不匹配、索引列使用函数、LIKE以%开头、复合索引未遵循最左前缀、OR条件中部分无索引、NULL值查询、频繁更新导致索引失衡、ORDER BY/GROUP BY未用索引列、配置或版本差异及过度依赖索引。阿里等大厂高频踩坑点需特别警惕。合理设计索引并结合执行计划优化,才能保障高效查询。(238字)
                    |
                    缓存 网络协议 算法
                    TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!
                    TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!
                    779 2
                    |
                    安全 算法 Java
                    Java CAS原理和应用场景大揭秘:你掌握了吗?
                    CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
                    713 2
                    |
                    Oracle 关系型数据库 中间件
                    |
                    存储 设计模式 安全
                    (五)深入剖析并发之AQS独占锁&重入锁(ReetrantLock)及Condition实现原理
                    在我们前面的文章《[深入理解Java并发编程之无锁CAS机制》中我们曾提到的CAS机制如果说是整个Java并发编程基础的话,那么本章跟大家所讲述的AQS则是整个Java JUC的核心。不过在学习AQS之前需要对于CAS机制有一定的知识储备,因为CAS在ReetrantLock及AQS中的实现随处可见。
                    511 0
                    |
                    IDE Java Apache
                    如何使用Maven管理Java项目依赖
                    如何使用Maven管理Java项目依赖
                    |
                    人工智能 移动开发 Java
                    Java智能之Spring AI:5分钟打造智能聊天模型的利器
                    尽管Python最近成为了编程语言的首选,但是Java在人工智能领域的地位同样不可撼动,得益于强大的Spring框架。随着人工智能技术的快速发展,我们正处于一个创新不断涌现的时代。从智能语音助手到复杂的自然语言处理系统,人工智能已经成为了现代生活和工作中不可或缺的一部分。在这样的背景下,Spring AI 项目迎来了发展的机遇。尽管该项目汲取了Python项目如LangChain和LlamaIndex的灵感,但Spring AI并不是简单的移植。该项目的初衷在于推进生成式人工智能应用程序的发展,使其不再局限于Python开发者。
                    1095 2