Java Spring 中的单例与原型 Bean 作用域

在 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。让我们通过一个示例来理解这个作用域:

Step 1: Cr

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/39307.html
点赞
0.00 平均评分 (0% 分数) - 0