在 Spring 框架中,Singleton(单例)和 Prototype(原型)Bean 作用域定义了 Spring IoC 容器如何创建和管理 Bean 实例。
- Singleton Scope(单例作用域):每个容器创建一个共享实例。所有请求都共享同一个对象。
- Prototype Scope(原型作用域):为每个请求创建一个新实例。每个请求获得一个独立的对象。
现代 Spring(特别是 Spring Boot)通常使用注解:
> @Component
>
> @Scope("prototype") // 或者 @Scope("singleton")
>
> public class HelloWorld { … }
Singleton Scope(单例作用域)
单例 Bean 意味着每个 Spring IoC 容器只有一个实例。容器在创建新实例之前会检查该实例是否已存在。默认情况下,除非显式定义,否则所有 Spring Bean 都是单例。让我们通过一个示例来理解这个作用域。
Step 1: Create a Maven Project(创建 Maven 项目)
- 打开 IntelliJ IDEA -> New Project
- 选择 Maven
- 选择你的 JDK
- 项目名称:SpringSingletonDemo
- 点击 Finish
Step 2: Create Package Structure(创建包结构)
!singleton包结构
Step 3: Add Spring Dependency (pom.xml)(添加 Spring 依赖)
添加 Spring Context 依赖以启用 Spring IoC。
XML
CODEBLOCK_af543d8c
说明:
- name 字段存储 Bean 的数据。
- setName():允许您设置 name 的值(在客户端中使用)。
- getName():允许您检索 name 的值。
Step 4: Create Bean Class (HelloWorld.java)(创建 Bean 类)
Java
CODEBLOCK_ad705639
Step 5: Create Spring XML Configuration File(创建 Spring XML 配置文件)
XML
CODEBLOCK_3fa2675c
说明:
- 标签向 Spring IoC 容器注册 HelloWorld。
- id="hw" 是该 Bean 的唯一标识符。
- class="bean.HelloWorld" 告诉 Spring 要实例化哪个类。
- scope="singleton" 指定 Spring 将只创建该 Bean 的一个实例,并在每次请求时重用它。
- 这个 XML 充当 Spring 容器的映射图,以便 Spring 知道如何管理 Bean 生命周期。
Step 6: Create Client Class (Client.java)(创建客户端类)
Java
CODEBLOCK_63d3c680
说明:
- ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"): 这一行加载 Spring IoC 容器并读取 spring.xml 以了解要创建哪些 Bean。
- HelloWorld Geeks1 = (HelloWorld) context.getBean("hw"):首次请求 Bean。Spring 此时会创建单例实例。
- Geeks1.setName("Geeks1"): 设置单例 Bean 的 name 属性。
- HelloWorld Geeks2 = (HelloWorld) context.getBean("hw"): 第二次请求 Bean。Spring 返回之前创建的同一个实例。
- System.out.println(Geeks1.getName()); 和 System.out.println(Geeks2.getName());:两者都打印 "Geeks1",因为这两个引用之间只共享一个对象。
Step 7: Run the Application(运行应用程序)
- 右键点击 Client.java
- 点击 Run
Output(输出):
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20260112155949555072/sinoutput.webp">sinoutput输出结果
Prototype Scope(原型作用域)
原型 Bean 意味着为每个请求创建一个新实例。不发生对象共享。原型作用域用于有状态的 Bean。让我们通过一个示例来理解这个作用域: