Spring概念:Bean作用域

news/2025/3/14 18:00:44/文章来源:https://www.cnblogs.com/huangwentian/p/18772573

在 Spring 框架里,Bean 作用域明确了 Spring 容器如何创建和管理 Bean 实例。不同的作用域适用于不同的应用场景,下面将详细介绍 Spring 中常见的 Bean 作用域。

1. singleton(单例)

解释

这是 Spring 默认的 Bean 作用域。当一个 Bean 被定义为单例作用域时,Spring 容器在整个应用的生命周期里只会创建该 Bean 的一个实例,并且所有对该 Bean 的请求都会返回这个唯一的实例。

示例代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}class MyBean {public MyBean() {System.out.println("MyBean 实例被创建");}
}import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);MyBean bean1 = context.getBean(MyBean.class);MyBean bean2 = context.getBean(MyBean.class);System.out.println(bean1 == bean2); // 输出 truecontext.close();}
}

适用场景

适用于那些无状态或者状态可以共享的 Bean,像服务层组件、数据访问对象(DAO)等。由于单例作用域只创建一个实例,所以能减少内存开销。

可能存在的问题及解决方案

  • 线程安全问题:若单例 Bean 是有状态的,多个线程同时访问该 Bean 时可能会出现线程安全问题。解决方案是保证 Bean 无状态,或者使用线程安全的类和同步机制。

2. prototype(原型)

解释

当一个 Bean 被定义为原型作用域时,每次从 Spring 容器请求该 Bean 时,容器都会创建一个新的实例。

示例代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;@Configuration
public class AppConfig {@Bean@Scope("prototype")public MyBean myBean() {return new MyBean();}
}class MyBean {public MyBean() {System.out.println("MyBean 实例被创建");}
}import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);MyBean bean1 = context.getBean(MyBean.class);MyBean bean2 = context.getBean(MyBean.class);System.out.println(bean1 == bean2); // 输出 falsecontext.close();}
}

适用场景

适用于有状态且状态不能共享的 Bean,比如需要为每个请求创建独立实例的场景。

可能存在的问题及解决方案

  • 内存开销问题:由于每次请求都会创建新实例,若频繁请求可能会导致内存开销增大。解决方案是合理控制原型 Bean 的使用,避免不必要的创建。

3. request(请求)

解释

此作用域仅适用于 Web 应用的 Spring 上下文。在一个 HTTP 请求的生命周期内,容器会为每个请求创建一个 Bean 实例,不同的请求会有不同的实例。

示例代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.context.WebApplicationContext;@Configuration
public class AppConfig {@Bean@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)public MyBean myBean() {return new MyBean();}
}class MyBean {public MyBean() {System.out.println("MyBean 实例被创建");}
}

适用场景

适用于需要在一个请求内保持状态的 Bean,例如处理用户请求时存储请求相关信息的 Bean。

可能存在的问题及解决方案

  • 代理模式问题:在使用 request 作用域时,通常需要使用代理模式(如 ScopedProxyMode.TARGET_CLASS),否则可能会出现注入失败的问题。

4. session(会话)

解释

该作用域也仅适用于 Web 应用的 Spring 上下文。在一个用户会话的生命周期内,容器会为每个会话创建一个 Bean 实例,不同的会话会有不同的实例。

示例代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.context.WebApplicationContext;@Configuration
public class AppConfig {@Bean@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)public MyBean myBean() {return new MyBean();}
}class MyBean {public MyBean() {System.out.println("MyBean 实例被创建");}
}

适用场景

适用于需要在用户会话期间保持状态的 Bean,例如存储用户登录信息的 Bean。

可能存在的问题及解决方案

  • 会话管理问题:如果会话过期或者被销毁,对应的 Bean 实例也会失效。需要确保在会话管理方面进行合理配置。

5. application(应用)

解释

同样适用于 Web 应用的 Spring 上下文。在整个 Web 应用的生命周期内,容器只会创建一个 Bean 实例,类似于单例作用域,但它是基于 ServletContext 的。

示例代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.context.WebApplicationContext;@Configuration
public class AppConfig {@Bean@Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)public MyBean myBean() {return new MyBean();}
}class MyBean {public MyBean() {System.out.println("MyBean 实例被创建");}
}

适用场景

适用于需要在整个 Web 应用中共享状态的 Bean,比如全局计数器等。

可能存在的问题及解决方案

  • 资源竞争问题:多个线程同时访问应用作用域的 Bean 时可能会出现资源竞争问题。可以使用同步机制来解决。

6. websocket(WebSocket)

解释

这是 Spring 4.2 引入的作用域,适用于 WebSocket 应用。在一个 WebSocket 会话的生命周期内,容器会为每个 WebSocket 会话创建一个 Bean 实例。

示例代码

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.web.socket.config.annotation.EnableWebSocket;@Configuration
@EnableWebSocket
public class AppConfig {@Bean@Scope(value = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)public MyBean myBean() {return new MyBean();}
}class MyBean {public MyBean() {System.out.println("MyBean 实例被创建");}
}

适用场景

适用于处理 WebSocket 会话相关的 Bean,比如存储 WebSocket 会话状态的 Bean。

可能存在的问题及解决方案

  • 会话管理复杂:WebSocket 会话的管理相对复杂,需要确保在会话关闭时正确处理 Bean 实例。可以在 WebSocket 处理器中添加相应的关闭逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898783.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven JavaFX使用SCSS样式表

原理 JavaFX本身的CSS解析器不支持SCSS,因此我们需要在编译阶段将SCSS文件编译为CSS文件,然后在JavaFX中引入CSS文件。 本文使用的编译插件是sass-cli-maven-plugin。 使用 POM文件设置 代码如下: <build><plugins><plugin><groupId>us.hebi.sass&l…

linux中如何判断一个rpm是手动安装还是通过yum安装的

现状 对于一个不熟悉的服务器或者是虽然是自己的服务器,但历史比较久远,对于上面安装了的一些软件包,我们记忆都慢慢模糊了。 我今天遇到一个情况,在安装一个工具x2openEuler时,安装失败,提示依赖冲突: [root@VM-0-6-centos x2openeuler]# yum install x2openEuler-core…

如何让你的应用在市场中脱颖而出?

开发者在完成应用开发并成功上架应用市场后,将面临一项重要挑战:如何在竞争激烈的环境中脱颖而出,吸引用户的关注?为此,提升应用的曝光度和下载量至关重要。 HarmonyOS SDK应用市场服务(Store Kit)提供应用市场业务的对外开放能力,针对想要获得曝光的应用,Store Kit提…

阿里通义实验室语音团队负责人鄢志杰离职;苹果计划在 AirPods 上配备实时对话翻译功能丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

OP90-1工作原理

step1.压紧弹簧及产品 上下气缸压紧弹簧,产品压紧气缸压紧产品step2.弹簧钩下降 拉簧钩紧气缸伸出,带动弹簧钩下降step3.弹簧钩带动弹簧转动,下弹簧脚进槽step4.弹簧钩提起step5.弹簧钩旋转,带动弹簧越过高处,到达卡槽正上方step6.弹簧钩下降step.弹簧钩回退撤出 弹簧钩回…

Java的volatile和sychronized底层实现

1. 概览 从Java代码级别到硬件级别各层都是如何实现的2. Synchronized 2.1 字节码层面 使用javap -verbose <class文件>可以查看到字节码信息,其中synchronized方法会有flags:ACC_SYNCHRONIZED,此时字节码中不会包含monitorenter和moniotrexit,JVM会自动加 public syn…

信息资源管理文字题之“服务支持类的五大运营流程图”

一、为了充分利用ERP信息系统资源,LX集团采用了各种先进的信息系统管理理念和方法,包括IT服务管理,下图为LX集团IT服务管理中服务支持类的五大运营流程图 要求:将图中标有序号的空白处的正确能容,按序号填写 二、答案变更请求 最终软件库 配置管理数据库 影响分析 授权 变…

洛谷 P3979 遥远的国度 做题记录

ds。前置芝士:树链剖分 思路 我们先随手画出一张图:我们首先以 \(1\) 为根构造这颗树。 这张图比较特殊,因为这张图的编号同时也是他的 dfn 序。 我们将其分类讨论。设当前根节点为 \(rt\),查询的节点为 \(x\),那么:当 \(rt=x\) 时(图中蓝圈部分),我们可以访问所有的节…

actuator-系统监控功能

系统监控功能actuator-系统监控功能 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>application.yml server:port: 8080servlet:context-path: …

首页页面布局(1)

import { TaskItem } from ../view/TaskItemimport { TaskStatisties } from ../view/TaskStatisties@Entry@Componentstruct TaskList { @State message: string = Hello World build() { Stack({alignContent:Alignment.BottomEnd}){ Column() { // 第1个模…

算法备案承诺书指南,5分钟速览

算法备案承诺书是算法备案初审的重要文件,和《落实算法安全责任基本情况》是初审阶段难度最大的两份材料。今天我就结合过往经验总结下这份文件的要点,帮助大家快速理解。TIPS:不要照搬这份模板,仅供学习了解。也不要买模板!不同行业和不同服务形态、不同服务对象都有区别…

信创替代必看:禅道/ONES/Jira功能对比及迁移方案

信创项目管理工具:赋能企业数字化转型的利器 在这个数字化转型的浪潮中,项目管理工具成为了企业发展的关键。它们不仅帮助团队提高效率,还能推动创新,为企业带来更大的价值。今天,让我们一起探索这些工具的魅力,以及它们如何在信创领域大放异彩。 项目管理工具的重要性 项…