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 实战(第四版)

关于图像傅里叶变换得到的频谱图的通俗理解 傅里叶变换过程: 经过傅里叶变化且频谱居中化处理的频谱图: 1.如果将图像某一行上的灰度变化看作是一个离散信号,那么整张图像可以看作是一个分布在二维平面上的信号,因此图像可看作是空间域信号。傅里叶变换则是将图像灰度分布(空间域信号)变换到了频域上,给我们提供了观察图像的另一个视角。 2.图像的频谱图(频谱居中后)的中心点是频率最低点,以该点为圆心,不同半径的上的点表示不同的频率。这里的图像频率是指对应原图像中的某灰度曲线变化的快慢(这么说不严谨,但是按照上面第1点的角度,似乎也可以这么理解 阅读详情

相关推荐

Kubernetes多网卡环境下Calico网络配置避坑指南:如何精准指定业务网卡

本文针对Kubernetes多网卡环境下Calico网络配置的常见痛点,提供了精准指定业务网卡的实战指南。通过深入分析Calico的IP自动检测机制,详细解读并对比了五种IP_AUTODETECTION_METHOD配置方法(如interface、cidr、can-reach等),帮助运维人员从根源上解决网络分区和Pod通信失败问题,确保生产集群网络的稳定与可靠。

weixin_28835551的博客 730

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

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

小蚯蚓的博客 1070

阻容降压 vs 开关电源:5V小功率供电方案成本与安全深度对比

本文深度对比了阻容降压电路与开关电源在5V小功率供电方案中的核心差异。重点剖析了二者在成本、体积、效率、温升及安全隔离等方面的优劣,并结合智能温控器、LED驱动等典型应用场景,为硬件工程师提供了清晰的选型决策框架,帮助在成本与安全之间做出最佳权衡。

weixin_29310631的博客 702

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

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

Java学习之道 4974

【异常】OpenAI提示内容有误 Invalid prompt: your prompt was flagged as potentially violating our usage policy.

用户需优先调整提示内容,确保符合OpenAI的使用政策。若问题持续,建议结合请求ID和具体代码示例联系官方支持。同时,可参考腾讯云、Microsoft Q&A等平台提供的错误处理实践(如重试机制、日志记录)优化代码健壮性。

奶爸的编程之路,也就一周冷个三天 2081

数仓建模—数据语义层

如今,企业产生大量数据,需要以正确的方式进行分析才能做出重要决策。数据可能来自多个来源并采用不同的格式,这使得清楚地了解其含义和重要性成为一项挑战。这就是语义层的用武之地。语义层存在于数据仓库和最终用户使用的应用程序之间。它为用户提供了简化且一致的数据视图,无论其基础数据源的复杂性如何。该逻辑层有助于映射物理数据结构以创建概念数据模型。它定义了数据元素之间的所有规则和关系,并以业务术语提供了数据的通用词汇表。然后,用户可以轻松地与数据进行交互,而无需了解其数据源的技术知识。

7万+

Spring学习笔记-注解

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

一片蓝蓝的云 528

YOLOv12涨点改进 | 独家创新-注意力改进篇 | ECCV 2024 | YOLOv12引入AgentAttention代理注意力模块,兼顾 Softmax 和线性注意力优点,提高检测精度

🔥本文给大家介绍使用Agent Attention模块改进YOLOv12网络模型。其主要作用是通过引入高效的代理token来减少计算复杂度,同时保留全局上下文建模能力。相比传统的Softmax注意力,Agent Attention通过代理token聚合并广播信息,从而降低了模型在处理高分辨率图像时的计算负担,并显著提高了推理速度。其优势在于保持了目标检测中的全局信息处理能力,同时加速了生成过程,特别是在高分辨率场景下,可以提高检测精度、减少内存消耗,并提升处理速度。

Ai缝合怪、助力小伙伴高效发论文 155

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

Hermes Agent 对阵 OpenClaw:自我改进的 AI 队友

但在 2026 年 2 月,Nous Research 发布了 Hermes Agent,它带来了不同的愿景:一个不仅能够运行,还能学习的代理。在完成复杂的多步骤任务后,它会分析自己的操作并创建一个可复用的技能。对于已在使用 OpenClaw 的澳大利亚企业而言,这意味着您可以试用 Hermes Agent,而无需丢失数月的配置和自定义成果。最重要的区别在于理念:OpenClaw 是一个需要配置的工具,而 Hermes Agent 则是一个会学习的队友。OpenClaw 的技能是静态的。

xiaoshun007的专栏 1571

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

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

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

林海静的博客 1092

EMC意义下的共模(Common Mode)和差模(Differential Mode)

在电子产品中,信号或电源通过两根导线传输。对比维度差模(DM)共模(CM)电流方向一进一出,相等相反同向、相等回流路径两根导线组成的闭合回路地或外壳EMC影响较小容易辐射干扰,重点治理类型定义有用信号干扰信号抑制方法常规滤波器、电感、电容共模电感、磁环、屏蔽、接地技术等。

weixin_43199439的博客 1248

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

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

JCoder的博客 1156

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

first_M的博客 1305

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

weixin_39528289的博客 60

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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、付费专栏及课程。

余额充值