Spring框架中的Singleton和Prototype Bean作用域

这篇具有很好参考价值的文章主要介绍了Spring框架中的Singleton和Prototype Bean作用域。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring框架是依赖注入的事实上的框架,在开发可扩展、弹性和安全的云原生环境中具有良好的记录。

在使用Spring Beans时,初学者经常会对Spring beans和它们的作用域感到有些困惑。

以下是我对Singleton和Prototype Bean作用域的简单示例进行阐述的尝试。

Singleton Bean作用域:正如其名称所示,作用域为Singleton的beans在Spring应用程序上下文中只有一个实例可用,然而值得注意的是,同一bean在Spring常量中可以具有不同的Bean名称下拥有多个实例。

这个想法与_Singleton设计模式_的概念有些不同,后者表示一旦将Java类设计为单例,JVM将在内存中只有单个实例可用。

Illustration 1.0 下面的插图显示了一个账户服务Spring bean,该bean可以具有不同的名称,同一服务在Spring上下文中可以存在两个不同的名称。

Spring框架中的Singleton和Prototype Bean作用域,spring,单例模式,原型模式,java,后端
 

当我们在Java应用程序中引用一个singleton类时,该类只有一个实例可用,然而在Spring中,Singleton并不意味着上下文中只有一个该类型的实例,它可以有多个具有不同名称的该类型实例。

Prototype Bean作用域:当应用程序程序员将bean的作用域定义为Prototype时,这意味着每次有人请求引用一个bean时,Spring框架会返回全新的bean实例。Spring框架管理对象类型。

Illustration 1.1: 下面的插图定义了一个Prototype作用域的bean,并解释了每次我们请求Spring时,Spring都会提供所请求的bean的新实例。

Spring框架中的Singleton和Prototype Bean作用域,spring,单例模式,原型模式,java,后端
 

为什么要让一个bean具有Prototype作用域?

Prototype作用域是为了避免两个线程在访问Singleton Bean时出现竞争条件。由于多线程环境的交错性质,这是一个经典的并发问题,操作的结果是不可预测的。因此,为了确保每个线程都获得自己的bean副本,开发人员希望确保每个线程都获得自己的副本。

什么是竞争条件?

以股票应用程序为例。股票价格每秒钟更新一次,并且用于为特定股票ID更新股票价格的代码是在并发上下文中编写的,这意味着可能有多个调用者试图更新股票X的价格。考虑一个一系列步骤的情况:

1.Mike试图将股票X的价格更新为110美元。2.Mike读取股票X的价格并将其增加到120美元。3.与此同时,在Mike将此写入主内存之前,他去了洗手间。4.Bob拿着咖啡回来,看到屏幕上的旧股票价值为105,他将股票X的价值更新为125美元。5.Mike回来,然后将股票X的值再次更新为120美元。6.由于这个构造,Mike想要对股票X进行的更新对Bob是不可见的,他再次覆盖了它。7.这是典型的竞争条件,我希望每个人都理解,就像Mike和Bob可以在这里被线程A和线程B替换一样,在并发环境中。

如果StockPrice被定义为Prototype作用域的bean,则每个线程都会获得其自己的StockPrice副本,它们不会互相干扰。但是,获得Stock价格的不同副本并不消除对给定股票的Stock价格更新进行同步的需要,它需要在一系列原子步骤中完成,但为了避免复杂性,我们可以略过这个讨论,以便理解Prototype Bean作用域。

Illustration 1.2: 下面的插图定义了一个Prototype作用域的bean,并解释了每个线程都会获得Prototype bean的新实例。

Spring框架中的Singleton和Prototype Bean作用域,spring,单例模式,原型模式,java,后端

总结:

1.默认情况下,Spring bean的作用域是Singleton。2.Singleton作用域的bean在Spring应用程序上下文中可以具有不同的名称下的多个实例。3.Prototype bean是Spring框架提供的一个约定,每次请求时都会由框架提供bean的新实例。4.Prototype作用域的bean可以用于Singleton作用域的bean,但应该注意我们如何从上下文中获取该bean,因为如果将Prototype bean定义在Singleton bean内部,则Spring提供的原型bean实例只会有一个,这违背了其自身的目的。5.为了避免竞争条件,可以使用Prototype Bean作用域。
文章来源地址https://www.toymoban.com/news/detail-668199.html


到了这里,关于Spring框架中的Singleton和Prototype Bean作用域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring学习】Bean对象的作用域和生命周期,了解了这些你就真正熟悉spring框架了.

    前言: 大家好,我是 良辰丫 ,我们已经学会了Spring的存取,今天我们将一起来学习Bean对象的作用域和生命周期.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期

    2024年02月07日
    浏览(62)
  • Spring框架中的Bean

    在Spring框架中,Bean是指一个由Spring容器管理的对象。这个对象可以是任何一个Java类的实例,例如数据库连接、业务逻辑类、控制器等等。Bean实例的创建和管理是由Spring容器负责的,而不是由应用程序本身负责。 Bean的主要优势是可以将对象的创建和管理与业务逻辑分离。这

    2023年04月09日
    浏览(32)
  • 你担心spring容器中scope为prototype的bean太大内存溢出吗?

    之前一直担心spring的scope为prototype的bean在一些高并发的场景下,吃不消吗,甚至会内存溢出,这样的担心不是没有道理的,(以下是假设)因为这个类型的bean每一次都会产生新的实例,如果每个实例做一些时间比较长的任务,然后它会在这段时间常驻内存。那么它会爆炸吗?

    2024年02月06日
    浏览(36)
  • spring复习:(50)@Configuration注解配置的singleton的bean是什么时候被创建出来并缓存到容器的?

    一、主类: 二、配置类: 三、singleton bean的创建流程 运行到context.refresh(); 进入refresh方法: 向下运行到红线位置时: 会实例化所有的singleton bean.进入finisheBeanFactoryInitialization方法: 向下拖动代码,可以看到beanFactory.preInstantiateSingletons(); 进入preInstantiateSingletons方法: 可以看

    2024年02月16日
    浏览(38)
  • Spring bean定义&Spring Bean 的作用域

    目录 Spring bean定义   Spring配置元数据 Spring Bean 的作用域   singleton作用域:   原型作用域: 示例:   形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean。bean被实例化,组装,并通过Spring IoC容器所管理的对象。这些bean由容器提供,例如,在XML的bean/定义,已经看到了

    2024年02月08日
    浏览(42)
  • Spring Bean 的作用域(Bean Scope)

    大家好,我是 god23bin,今天我们来聊一聊 Spring 框架中的 Bean 作用域(Scope)。 我们在以 XML 作为配置元数据的情况下,进行 Bean 的定义,是这样的: 我们写了一个 Bean 定义(Bean Definition),就是用于创建所定义的类的实例的。 一个 Bean 定义,我们可以类比一个类的定义,你

    2024年02月09日
    浏览(40)
  • 【Spring】Bean的作用域

    根据 【动力节点】最新Spring框架教程,全网首套Spring6教程,跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理, 文档密码:mg9b Spring 相关文章整理汇总归纳于:https://www.yuque.com/u27599042/zuisie singleto

    2024年02月14日
    浏览(46)
  • Spring中Bean的作用域和Spring生命周期

    从前面的文章中我们看出Spring是用来存储和读取Bean的,因此Spring中Bean是最核心的资源,所以我们将对Bean进行深入的理解。 现在有一个公共的Bean,提供给了两个用户去使用,但是在使用过程中,用户一修改了公共的Bean数据,当用户2在使用时,却发现产生了逻辑上的错误。

    2024年02月16日
    浏览(45)
  • Spring Bean 作用域的定义

            在 Spring 配置中,我们可以通过 scope 属性来定义 Spring Bean 的作用域,可以接受 5 个内建的值,分别代表 5 种作用域类型,下面给大家详细总结一下: 1、singleton,用来定义一个 Bean 为单例,也就是说在 Spring loC 容器中仅有唯一 的一个实例对象,Spring 中的 Bean 默认

    2024年02月12日
    浏览(36)
  • Spring Bean作用域与生命周期

    目录 Bean的作用域: Bean有六大行为模式 1、singleton:单例模式(默认) 2、prototype: 原型模式(多例模式) 3、request: 请求作用域(Spring MVC) 4、session: 会话作用域(Spring MVC) 5、application: 全局作用域(Spring MVC) 6、websocket: HTTP WebSocket 作用域(Spring WebSocket) applicationContext和singleton的区别  Bea

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包