Spring 基于注解设置 Bean 的作用域

Bean的6种作用域是什么?如何使用? Bean对象在Spring的IOC容器中是重要的资源,那么你知道它的作用域是什么吗?你会使用吗?让我们一起来看看~ 阅读详情

Spring 中 Bean 的作用域

前言

在默认情况下,Spring应用上下文中所有的 Bean 都是作为以单例的形式创建的。也就是说,不管给定的一个 Bean 被注入到其他 Bean 多少次,每次所注入的都是同一个实例。
在大多数情况下,单例的 Bean 是很理想的方案,初始化和垃圾回收对象实例所带来的成本只留给一些小规模任务。在这些任务中,对对象的保持无状态并且在应用中反复重用这些对象可能并不合理。

Bean 的作用域

Spring 定义了多种作用域,可以基于这些作用域创建 Bean,包括:

  • 单例(Singleton):在整个应用中,只创建 Bean 的一个实例。
  • 原型(Prototype):每次注入或者通过 Spring 应用上下文获取的时候,都会创建一个新的 Bean 实例。
  • 会话(Session): 在 Web 应用中,为每个会话创建一个 Bean 实例。
  • 请求(Request):在 Web 应用中,为每个请求创建一个 Bean 实例。

单例是默认的作用域。如果选择其他的作用域,要使用 @Scope 注解,他可以与 @Component 或者 @Bean 一起使用。

详细:

例如,如果你使组件扫描来发现和声明 Bean,那么你可以在 Bean 的类上使用 @Scope 注解,将其声明为原型 Bean :

@Component
@Scope(ConfigurableListableBeanFactory.SCOPE_PROTOTYPE)
public class BeanScope {

    private String name;

    public String getName() { return name; }

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

这里,使用 ConfigurableListableBeanFactory 类的 SCOPE_PROTOTYPE 常量设置类原型作用域。当然也可以直接使用 @Scope(“prototype”),但是使用 SCOPE_PROTOTYPE 常量更加安全并且不易出错。
下面两张图,一个是原型 Bean 模式下的一个是单例 Bean 模式下的不同输出结果。

原型 bean 作用域:

这里写图片描述

单例 bean 作用域:

这里写图片描述

会话/请求 作用域与上面的形式稍有不同。

会话:
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION,
        proxyMode = ScopedProxyMode.INTERFACES)
public class BeanScope {
    …………
}
请求:
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST,
        proxyMode = ScopedProxyMode.INTERFACES)
public class BeanScope {
    …………
}

会发现,@Scope 同时还有一个 proxyMode 属性,他被设置成了 ScopedProxyMode.INTERFACES 。这个属性解决了将会话或者请求作用域的 Bean 注入成单例 Bean 中所遇到的问题。

@Service
public class BeanServiceImpl {
    @Autowired
    private void setBeanScope(BeanScope beanScope) {
        this.beanScope = beanScope;
    }
}

看到上面的代码,因为 BeanServiceImpl 是一个单例的 Bean ,会在 Spring 应用上下文加载的时候创建,当他创建的时候,Spring 会试图将 BeanScope 的 Bean 注入到 setBeanScope() 方法中。 但是 BeanScope Bean 是会话(或请求)作用域的 Bean。此时并不存在。直到某个用户进入系统,创建会话之后,才会创建 BeanScope 实例。

另外,系统中将会有多个 BeanScope 实例:每个用户一个。我们并不想让 Spring 注入某个固定的 BeanScope 实例到 BeanServiceImpl 中。我们希望的是当 BeanServiceImpl 做业务逻辑的时候,他所使用的 BeanScope 实例恰好是当前会话(或请求)所对应的那一个实例。

Spring 并不会将实际的 BeanScope Bean 注入到 BeanServiceImpl 中,Spring 会注入一个到 BeanScope Bean 的代理。如图:
这里写图片描述

这个代理会暴露与 BeanScope 相同的方法。但是,当 BeanServiceImpl 调用 BeanScope 的方法时,代理会对其进行懒解析并调用委托给会话作用域内的真正 BeanScope Bean。

proxyMode 属性

如配置所示, proxyMode 属性设置成了ScopedProxyMode.INTERFACES ,表明这个代理要实现 BeanScope 接口,并将调用委托给实现的 Bean。

但是 BeanScope 不是接口是类(最好是接口 - -,上面只是为了演示)。Spring 就没办法创建基于接口的代理了。此时,他必须使用 CGLib 生成基于类的代理。所以, Bean 类型是具体类的话,我们必须要将 proxyMode 属性设置为 ScopedProxyMode.TARGET_CLASS 依次来表明要以生成目标类扩展的方式创建代理。


若博客中有错误或者说的不好,请勿介意,仅代表个人想法。
csdn博客:https://blog.youkuaiyun.com/LNView
本文地址:https://blog.youkuaiyun.com/LNView/article/details/80292107

有问题或者喜欢的欢迎评论。

转载请注明出处!!!!!!

参考资料
Spring 实战(第四版)

单细胞marker基因表达密度图-(还有一个包装函数) 我们借助Nebulosa,将上面的过程包装为一个函数,还是那句话,受累麻烦的事我们来解决,您轻松即可,先看看函数参数:需要注意的是,如果你只想框选某一类celltype,理想模式是这群celltype是单独聚类的,没有散落在其他类群,否则将会全部框选,效果不好,建议使用AI/PS添加。需要注意,这里我算是投机取巧了,用了一个和这个作图毫无关系的包ggnetwork,主要的目的是用他的theme_blank()主题,一次性将所有清空,当然也可以自己慢慢写,不过有现成的,为啥不用呢?这质感不就上去了嘛。 阅读详情

相关推荐

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 206

Spring(9):通过注解设定Bean的作用域

一、作用域 Spring的bean作用域包含Singleton、prototype、web(request、session、application、websocket)等作用域,当前以多例模式为例,展示使用方法。 二、环境 1.Pom <dependencies> <dependency> <groupId>org.spring...

小蚯蚓的博客 1070

Visual Studio 2013 + Intel(R) Visual Fortran 安装教程

安装了好几遍,ivf都不能加载到vs中,中途放弃了vs,又改用codeblocks编译器,依然在写fortran的时候出现了各种问题,于是又放弃了codeblocks改回vs,总之是折腾了好久,终于装明白了ivf并且将fortran模板成功加载到vs中。 PS:一定要安装Intel Visual Fortran.Composer XE.2013-SP1,不要用Intel Visual Fortr...

Coco_wjy的博客 12万+

Spring Bean的作用域以及注解使用

点击上方 Java学习之道,选择 设为星标每天12点,干货准时奉上!Spring Bean的作用域Spring Bean 的作用域即为对象的作用范围。Spring Bean的作用域由配置项...

Java学习之道 4974

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中,Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件,Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。

I AM COMING BACK... 3550

华东理工大学计算机预推免面试

华东理工大学预推免面试经验分享

D1379951481的博客 1402

Spring学习笔记-注解

注解 1.注解 注解是在写java代码时最经常用到的一种方法,注解就是Annotation。 注解一般用@来表示,比如我们最常用的@Resource,@Autowired等等这些 2.常用的注解 @SpringBootApplication 是Sprnig Boot项目的核心注解,目的是开启自动配置,用来标注在主程序的,表明他是一个springboot项目 @SpringBootApplication 中包含 @link Configuration、@link EnableAutoCon.

一片蓝蓝的云 528

禾赛激光雷达AT128P/海康相机(1):ROS环境设备驱动

sudo cp *.so /opt/MVS/lib/64/ # 复制当前文件夹中所有.so文件 到 “/opt/MVS/lib/64/” 文件中。将相应的.so文件复制到 /opt/MVS/lib/64/。我解压的是x86_64的,解压之后,打开,再解压MVS。然后在上一层,也就是选择x86_64那一层打开终端。新建一个工作空间,或者打开自己的工作空间。)包放在src内,并解压,然后编译。MVS V2.1.2下载之后解压,// 驱动代码下载到src文件里面。// 特定文件夹中打开终端。

努力努力努力 882

Spring中注解方式下Bean的作用域

简介 Spring bean 作用域默认是 单例 singleton;可以通过配置 prototype实现多例; 被注入到Spring中的类 Account.java @Scope("singleton") @Component public class Account { } User.java @Scope("prototype") @Component public class User { } 注:Scope的值,也可以使用下面的方式指定: 测试代码 public class Scop

哈 1096

【YOLOv8科研级优化】集成YOLOv10的SCDown采样模块,让你的模型下采样更高效更精准

打开确保模型解析器能识别SCDown模块。通过将YOLOv10的SCDown模块集成到YOLOv8中,我们实现了一个“细节保留+高效下采样”的目标检测模型。这个改进不仅在工程上能提升小目标、细粒度场景的检测效果,更在科研上提供了“分阶段下采样”的创新思路——这种思路可以延伸到其他卷积网络(如ResNet、MobileNet)的下采样层改进中,帮你在论文中打造独特的研究点。

m0_71589036的博客 137

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发

2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 156

Spring注解@Scope-设置组件作用域及bean的创建时间

一、对象的创建模式 @Scope的value值: 注:最后两种不常用 1、spring默认创建对象是单例的 定义配置类,加载Person对象 单例模式默认不写@Scope标签 测试: @Test public void test02(){ AnnotationConfigApplicationContext applicationContext = new Anno...

林海静的博客 1092

x2-DFD:A framework for explainable and explainable deepfake detection

该文章提出了X2-DFD框架,用于可解释和可扩展的深度伪造检测。通过评估大型多模态语言模型(MLLMs)在深度伪造检测中的内在能力,发现它们在不同伪造相关特征上的有效性各异。基于此,实施了针对性的微调策略,显著提高了MLLMs的解释能力,并整合了外部深度伪造检测器(EDDs),以结合MLLMs和传统检测器的互补优势,实现更好的检测和解释。

志在山顶的人,不会贪念山腰的风景 510

【Spring】2.Spring中Bean的生命周期管理及定义

Spring框架中的Bean是构成应用核心的对象,由IoC容器负责其生命周期管理。Bean的生命周期包括实例化、属性设置、初始化、使用和销毁。开发者可以通过XML配置或注解定义Bean,并使用`InitializingBean`、`DisposableBean`接口或`@PostConstruct`、`@PreDestroy`注解来管理Bean的初始化和销毁行为。此外,Bean的作用域(如单例、原型、请求、会话、应用)决定了Bean实例的生命周期和可见性范围,可以通过XML配置中的`scope`属性进行设置

JCoder的博客 1156

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

重学Spring框架系列之——设置Bean的作用域

Bean的作用域 在Spring中,默认情况下创建的bean都是单实例对象,当然也可以通过实际的需求进行修改。我们可以将这种操作视为设置bean的作用域。实现的方式有配置文件和注解两种形式,然而不论是哪种方式它们都对应了四种作用域。 这四种作用域分别为: singleton(默认值):表示创建的对象是单实例的。 prototype:表示创建的对象是多实例的。 request:表示一次请求生成一个实例。 session:表示一次会话生成一个实例。 注:在这四种作用域中,singleton和prototyp

first_M的博客 1305

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

bean的作用域_Spring 框架基础(02):Bean的生命周期,作用域,装配总结

一、装配方式Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象。1、XML格式装配Spring最传统的Bean的管理方式。配置方式<bean 测试代码ApplicationContext 2、注解扫描在实际开发中:通常使用注解 取代 xml配置文件。常见注解@Component <==> &l...

weixin_39528289的博客 60

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring 框架基础 :Bean的生命周期,作用域,装配总结

一、装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象。 1、XML格式装配 Spring最传统的Bean的管理方式。 配置方式 <bean id="userInfo" class="com.spring.mvc.entity.UserInfo"> <prope...

hys8298的博客 121

bean加载context idea_Spring 框架基础(02):Bean的生命周期,作用域,装配总结

一、装配方式Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象。1、XML格式装配Spring最传统的Bean的管理方式。配置方式<bean id="userInfo" class="com.spring.mvc.entity.UserInfo"> <property name="na...

weixin_30595367的博客 114

Bean的作用域

/是一个预定义的常量@Beanuser.setName("张三");

烁岩的博客 1150

@Scope-设置Bean的作用域

@Scope @Scope:设置Bean的作用域 @Configuration public class MainConfig02 { /** * * @Scope:调整作用域 * * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。 * * 每次获取的时候才会调用方法创建对象; * * singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。 * * 以后

qq_33732195的博客 318

Spring Bean的作用域

@TOC Bean的作用域分类 Bean的执行时机

Julie的博客 426

Spring注解驱动开发第5讲——使用@Scope注解设置组件的作用域

写在前面 Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,并将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象。如果每次从Spring容器中获取对象时,都要创建一个新的实例对象,那么该如何处理呢?此时就需要使用@Scope注解来设置组件的作用域了。 本文内容概览 咱先看看在本文中我们要学习哪些知识点,从而从全局角度把握好方向。本文要学习的知识点疏览如下: @Scope注解概述 单实例Bean作用域 多实例Bean作用域 单实

李阿昀的博客 6009

Spring(16)——使用注解进行bean定义

16 使用注解进行bean定义除了在Spring配置文件中通过bean元素定义一个bean外。我们还可以通过在Class上使用特定的注解进行标注,然后让Spring去扫描这些特定的注解,并把它们当做一个bean进行定义。16.1 @Component@Component是Spring中用来定义bean最基本的注解,通过在Class类上标注对应的注解就可以让Spring扫描到对应的定义,并把其作为一

Elim的博客 7763

Spring 框架基础(02):Bean的生命周期,作用域,装配总结

一、装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象。 1、XML格式装配 Spring最传统的Bean的管理方式。 配置方式 <bean id="userInfo" class="com.spring.mvc.entity.......

【积累】,是一个长期持续的过程。 278

Spring中Bean的作用域

Spring中对Bean的理解什么是Bean 什么是Bean

上进的小仓鼠 886

Spring 中 Bean 的作用域以及生命周期

Spring 基本执行流程中 Bean 的生命周期详解, 以及 Spring 的六大作用域(单例作用域、原型作用域、请求作用域、会话作用域、全局作用域、WebSocket作用域)

这个人很懒, 什么都没留下(这是我写的) 1065
上一篇: Spring 自动化构建环境 ,一次打包到处运行
下一篇: Mysql 参数优化
Carey丶zsh
博客等级 码龄10年 15粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值