2.5 协调作用域不同步的Bean

Spring框架中Bean的不同作用域类型以及它们的使用场景 Spring 支持多种 Bean 作用域(Scope),用于定义 Bean 实例的创建方式和生命周期。通过合理选择 Bean 作用域,可以优化资源使用、确保线程安全,并满足复杂业务场景的需求。 阅读详情

在Spring容器中,最常见的为singleton与prototype作用域的Bean,当我们多次获取singleton作用域的Bean时,得到的都是同一个实例,而prototype作用域里则每次都产生一个新的Bean实例。我们知道,Spring容器在初始化某个Bean前,先会创建被依赖的Bean,然后再对该Bean进行初始化,如果此时为singleton作用域的Bean依赖prototype作用域的Bean,由于singleton作用域的Bean只初始化一次,故prototype作用域的Bean也只被注入一次,之后我们每次通过singleton Bean去访问prototype Bean时,得到的永远是最初的那个prototype Bean,也可以理解为singleton Bean把它所依赖的prototype Bean变成了singleton,这就违背了我们设置prototype Bean的初衷。

有以下两种解决思路:

  • 不使用依赖注入,当singleton 作用域的Bean每次需要prototype作用域的Bean是,主动向容器请求新的Bean实例。
  • 使用lookup方法注入

不建议使用第一种方法,因为此做法会导致程序代码与Spring API耦合,造成代码污染。使用lookup方法注入可以让Spring容器重写容器中调用者Bean的抽象或具体方法,返回查找容器中其他Bean的结果。为了使用lookup方法注入,大致需要如下两步

  • 将调用者Bean的实现类定义为抽象类,并定义一个抽象方法来获取被依赖的Bean
  • 在<bean.../>元素中添加<lookup-method.../>子元素让Spring为调用者Bean的实现类实现指定的抽象方法

以下给出demo:

beans.xml部分代码

 <bean id="chinese" class="spring实例.Chinese" >
        <!--name:指定需要让Spring实现的方法;bean:指定该方法的返回值-->
        <!-- Spring只要检测到lookup-method元素,会自动为该元素的name属性所指定的方法提供实现体 -->
        <!--实现getDog()方法,返回id="dog"的Bean-->
        <lookup-method name="getDog" bean="dog"/>
 </bean>
 <!--设置作用域为prototype的Bean-->
 <bean id="dog" class="spring实例.Dog" scope="prototype">
        <property name="name" value="柯基"></property>
 </bean>

定义调用者Bean的实现类Chinese类为抽象类,并定义抽象方法getDog()

public abstract class Chinese implements Person {
    private Dog dog;
    public abstract Dog getDog();
    public void hunt(){
        System.out.println("我带着ID为:"+getDog()+"出去打猎");
        getDog().run();
    }
}

Dog类

public class Dog {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void run(){
        System.out.println("名为["+getName()+"]的小狗不要命地跑!");
    }
}

主程序部分代码

ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
Chinese c=ctx.getBean("chinese", Chinese.class);
c.hunt();
c.hunt();

运行结果
我带着ID为:spring实例.Dog@1b279c9出去打猎
名为[柯基]的小狗不要命地跑!
我带着ID为:spring实例.Dog@d282e0出去打猎
名为[柯基]的小狗不要命地跑!

运行结果显示,每次通过Chinese实例调用getDog()方法,都会返回新的Dog实例。这里补充一下,实质上Spring实现方法的逻辑是固定的,如下代码:

public Dog getDog(){
    //获取Spring容器ctx
    ...
    //返回值
    return ctx.getBean("Dog");
}
SoC芯片时钟树优化实战:如何用分段CTS解决DDRPHY与Memory Controller的时序难题 本文深入探讨了SoC芯片时钟树优化中的分段CTS技术,重点解决DDRPHY与Memory Controller之间的时序难题。通过分析多域时钟架构的复杂性,提出三级分段CTS策略,并结合28nm移动SoC实战案例,展示如何通过Guide Buffer插入和本地段重构实现72%的跨域偏差改善。文章还涵盖5nm以下工艺的线阻变异、热梯度效应等特殊考量,为数字IC设计提供时钟树综合的高阶解决方案。 阅读详情

相关推荐

android OTA升级之后,apk崩溃无法启动

也就是说,我们这个高低版本是fingerprint相同的情况,这个问题追述到jenkins编译,启动job时会初始化一个BUILD_NUMBER值,这个值正好跟Android的build系统的名称重复,这就导致Android build系统那一套拼接时间戳的值不会走,因为jenkins一启动就会定义该值,而我们jenkins服务器迁移过,这个值又会从1开始累计,导致前后版本都是16,从而导致fingerprint一致。问题背景:系统版本从低版本升级到高版本后,apk崩溃启动失败。硬件平台:QCS6125。

kevin's cache的专栏 1346

Spring:协调作用域不同步的Bean

在整理之前,我们首先应该了解Spring支持的五种作用域: singleton:单例模式,singleton作用域下的Bean将只产生一个实例,因此我们每次获取的实例都是同一实例。 prototype:每次通过getBean()方法获取Bean实例时,都会产生一个新的Bean实例,因此每次的实例都不同 request:用于Web应用,对于一次Http请求,request作用域

VipMao的博客 1483

Unity Shader实战:用Matcap给你的低模角色快速换上‘次世代’材质(附完整Shader代码)

本文详细介绍了Unity中Matcap技术的实战应用,通过Shader代码实现低模角色的次世代材质表现。Matcap技术利用预烘焙光照贴图,显著提升材质质感同时保持极低性能消耗,特别适合移动游戏和独立开发。文章包含完整Shader代码、平面模型着色优化方案及动态环境反射增强技巧,帮助开发者快速提升低模视觉效果。

weixin_28718755的博客 385

协调作用域不同步的Bean

先了解一下Bean的作用域 spring提供了6种作用域:singleton、prototype、request、session、applicaton、websocket 我们常用的singleton和prototype singleton是默认值,singleton作用域的Bean只生成一个实例 prototype:通过容器的getBean()方法获取实例时,将会产生不同的实例 例如: bean...

chen_bin_的博客 256

别再手动算重量了!用C++给UG/NX写个自动计算零件质量与质心的插件(附完整源码)

本文详细介绍了如何使用C++为UG/NX开发智能质量分析插件,实现零件质量与质心的自动计算。通过结合NXOpen和UF_MODL API,设计高效的数据结构和批量处理机制,大幅提升机械设计效率。文章包含完整源码和实用技巧,帮助工程师告别手动计算,适用于复杂装配体的自动化工程计算。

weixin_30247307的博客 130

DP链路训练从HPD触发到通道对齐:原理与调试实战

高速数字接口的稳定工作依赖物理层信号的精确协商,链路训练正是DisplayPort接口中确保源端与接收端在速率、摆幅和时序上达成一致的关键机制。HPD作为链路状态变化的触发信号,与通道对齐一同构成了训练流程的首尾环节。理解从时钟恢复到均衡再到多通道对齐的完整过程,有助于快速定位显示异常问题。在工程实践中,借助DPCD寄存器交互和AUX通道日志,可以系统性地排查训练失败原因。围绕链路训练全流程进行剖析,重点探讨HPD触发机制、训练图案选择、寄存器配置以及链路降级策略,为显示方案开发与调试提供工程参考。

weixin_30110543的博客 234

Bean的作用域和生命周期

在 Spring 框架中,Bean 的作用域(Scope)和生命周期(Lifecycle)是两个非常重要的概念,决定了 Bean 的创建、存储和销毁方式

2301_76161469的博客 1664

VS2022下OSG+OSGEARTH开发环境一键配置指南(Win10 x64+CMake自动化构建)

本文详细介绍了在VS2022环境下配置OSG和OSGEARTH开发环境的完整指南,包括软件下载、CMake自动化构建、编译实战及环境验证。通过一键配置脚本和常见问题解决方案,帮助开发者快速搭建3D开发环境,提升开发效率。

weixin_28828243的博客 405

Spring基本用法6——协调作用域不同步的Bean

         前言:之前看到Spring中一个有趣的、但值得注意的问题,就是Spring中关于如何协调Bean作用域不同步?正常来讲,两个singleton作用域的bean存在依赖关系时,或者当prototype作用域的bean依赖singleton作用域的bean时,使用Spring默认提供的依赖注入管理即可,但是如果出现这种情况:singleton作用域的Bean依赖prototype...

风清扬 319

使用C#实现的多人语音视频系统:WebSocket与WebRTC集成

通过上述的代码示例,我们可以使用C#编写一个多人语音视频系统,该系统集成了WebSocket和WebRTC技术。当然,这只是一个简单的示例,实际的多人语音视频系统可能需要更多的功能和优化。通过结合这两种技术,我们可以实现实时的语音和视频通信,支持多人同时参与。在上述代码中,我们创建了一个WebSocket服务器,监听在本地的8080端口,并创建了一个WebRTC连接。接下来,我们将详细介绍如何使用C#编写一个多人语音视频系统,包括使用WebSocket建立连接和使用WebRTC进行实时通信。

TjsReact的博客 1633

美团mtgsig 1.2算法分析

mtgsig1.2的一些算法总结

记录一些web逆向的过程 3498

Spring5参考指南:Bean作用域

文章目录Bean作用域简介Singleton作用域Prototype作用域Singleton Beans 中依赖 Prototype-beanweb 作用域Request scopeSession ScopeApplication Scope作用域Bean的依赖自定义作用域 Bean作用域简介 Bean是Spring的根本,Spring本身就是一个一个的bean组成的,bean托管在Spring容...

程序那些事 5591

实现画布拖拽算子排布,通过flink实现算子编排计算,如何实现?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1070

Java中的不同Bean作用域

自定义作用域允许开发者根据特定需求创建新的作用域,提供更大的灵活性和控制。

网络技术联盟站 1141

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

Bean 的作用域

根据官方的说法,总共是有六种作用域,其中后面四种是只能使用在web中同时,因为spring默认是单例模式,在使用其他几种情况时,需要使用特定的注解作用域定义singleTon单例,这是默认作用域,每一个SpringIoC容器中,相同名称的实例只能有一个prototype每次使用bean就会进行创建,这是多例模式,注解:@Scope(scopeName = ConfigurableBeanFactory.request请求时,会创建新的bean,注解:@RequestScope。

2303_77303297的博客 2334

lwip-2.0.3

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

Spring Bean的五个作用域

Spring支持五个作用域:singleton、prototype、request、session、global session

Ahuuua的博客 1万+

VC中sqlite的使用

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

Spring中bean的作用域

Bean简介:    在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。Bean的作用域创建一个bean定义,其实质是

fengruifang的专栏 3万+

Spring中Bean的作用域

Spring 中 bean 的 5 种作用域,然后详细介绍 singleton 和 prototype 这两种最常用的作用域。

unber的博客 5911

Bean的作用域

文章目录1.5.1 Singleton 单例作用域1.5.2 Prototype 原型作用域1.5.3 具有原型Bean依赖关系的Singleton Bean1.5.4 Request,Session,Application,WebSocket 作用域1.5.5 自定义作用域参考文献 ​ 创建bean定义时,将创建一个配方,用于创建该bean定义所定义的类的实际实例。 bean定义是配方的想法很重要,因为这意味着与类一样,您可以从一个配方中创建许多对象实例。 ​ 您不仅可以控制要插入到从特定bean定义创建

terry 2076

Spring Bean 的作用域

Bean 作用域定义了 Bean 在 Spring 容器中的生命周期和可见范围。不同的作用域决定了 Bean 的创建时机、存储位置和销毁时机。Spring 提供了几种常用的 Bean 作用域,每种作用域都有其特定的使用场景。除了上述内置作用域外,Spring 还允许开发者定义自定义作用域。自定义作用域需要实现Scope接口,并注册到 Spring 容器中。

FireFox1997 1630

spring之Bean的作用域、GoF之工厂模式、Bean的实例化方式、Bean的生命周期

本文深入剖析Spring框架中Bean的生命周期管理机制,详细讲解单例(singleton)和原型(prototype)两种作用域的特点及适用场景。通过代码示例演示Bean生命周期的完整流程,包括实例化、属性注入、初始化前/后处理器调用、销毁等关键阶段。同时介绍Spring的多种实例化方式(构造方法、工厂模式、FactoryBean等)以及如何将自定义对象纳入Spring容器管理,帮助开发者全面掌握Spring Bean的管理机制和最佳实践。

m0_73941339的博客 1076

java中bean的作用域有哪些_Spring中Bean的5种作用域scope详解

Spring Bean简介:在spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。Bean的作用域创建一个bean定义,其实质是用该bea...

weixin_29536515的博客 5113

Spring Bean的作用域

Spring Bean 的作用域决定了 Bean 的生命周期和可见性。单例(Singleton)全局唯一:在整个应用程序中只有一个实例。默认作用域:如果未指定作用域,默认情况下 Bean 的作用域为 Singleton。原型(Prototype)每次请求新建:每次请求都会创建一个新的实例。线程安全:每个线程都有自己的实例。请求范围(Request Scope)每次请求新建:每个 HTTP 请求都会创建一个新的实例。适用场景:适用于需要在每个 HTTP 请求中创建新实例的场景。

yuehua00的专栏 1641

关于spring中Bean的四种作用域

Bean的作用域 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象 准备工作 新建User类 public class User { private String name; private int age; public User() { } public User(String name, int age) { this.nam

qq_40631968的博客 1714

java中bean的作用域有哪些_Spring中Bean的作用域

本节先简单介绍了 Spring 中 bean 的 5 种作用域,然后详细介绍 singleton 和 prototype 这两种最常用的作用域。作用域的种类Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域。Spring3 为 Bean 定义了五种作用域,具体如下。1)singleton单例模式,使用 singleton 定义的 Bean 在 Spring 容器中只有一个...

weixin_35106801的博客 2169
上一篇: 2.4 通过ApplicationContext接口获取Spring容器
下一篇: Spring事务传播
HamalAlpha
博客等级 码龄11年 5粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值