当前位置:首页 > 技术 > 正文内容

Spring Bean作用域机制:单例与原型实例详解

访客 技术 2026年8月13日 1

Bean 作用域的六种形态

在 Spring 容器中,每个 Bean 定义都可以指定其作用域,控制实例的创建方式与生命周期。Spring 提供了以下六种作用域:

作用域说明
singleton(默认)在整个 Spring IoC 容器中,每个 Bean 定义只存在一个共享实例。
prototype每次请求该 Bean 时,都会创建新的实例。
request限定在单个 HTTP 请求的生命周期内,每个请求拥有独立实例。仅适用于 Web 环境。
session限定在 HTTP Session 的生命周期内。仅适用于 Web 环境。
application限定在 ServletContext 的生命周期内。仅适用于 Web 环境。
websocket限定在 WebSocket 的生命周期内。仅适用于 Web 环境。

其中,singletonprototype 是两种基础且通用的作用域,其余四种只适用于 Web 应用上下文。

单例与原型的行为差异

单例 Bean 保证容器中只存在一个实例,所有注入点共享同一个对象;原型 Bean 则每次注入或调用 getBean() 时都会生成全新对象。

代码演示

定义一个简单的实体类用于演示:

package com.example.demo.model;

public class Student {
    private int id;
    private String name;

    public Student() {
    }

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{id=" + id + ", name='" + name + "'}";
    }
}

Spring XML 配置中分别声明单例和原型 Bean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 单例 Bean -->
    <bean id="singletonStudent" class="com.example.demo.model.Student" scope="singleton">
        <property name="id" value="1"/>
        <property name="name" value="Alice"/>
    </bean>

    <!-- 原型 Bean -->
    <bean id="prototypeStudent" class="com.example.demo.model.Student" scope="prototype">
        <constructor-arg index="0" value="2"/>
        <constructor-arg index="1" value="Bob"/>
    </bean>
</beans>

测试代码验证实例唯一性:

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.example.demo.model.Student;

public class ScopeTest {

    @Test
    public void testScope() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-config.xml");

        Student s1 = ctx.getBean("singletonStudent", Student.class);
        Student s2 = ctx.getBean("singletonStudent", Student.class);
        System.out.println("单例引用相同: " + (s1 == s2));  // true

        Student p1 = ctx.getBean("prototypeStudent", Student.class);
        Student p2 = ctx.getBean("prototypeStudent", Student.class);
        System.out.println("原型引用相同: " + (p1 == p2));  // false
    }
}

运行测试,控制台输出:

单例引用相同: true
原型引用相同: false

结果表明,单例 Bean 每次返回的都是同一个实例,而原型 Bean 每次都会创建新对象。

标签: Spring

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。