Spring为什么默认是单例的?

这篇具有很好参考价值的文章主要介绍了Spring为什么默认是单例的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、五种作用域

二、单例bean与原型bean的区别

 三、单例Bean的优势与劣势


一、五种作用域

1.singleton:

singleton是Spring Bean的默认作用域,也就是单例模式。在整个应用程序中,只会创建一个实例,Bean的所有请求都会共享这个实例。

2.prototype:

prototype表示原型模式,每次请求都将创建一个新的Bean实例。因此,在应用程序中可以有多个实例,这些实例之间不会相互影响。

3.request:

request表示在HTTP请求范围内创建Bean实例。每次发出HTTP请求时,都会创建一个新的Bean实例,这个Bean实例只能在当前请求中使用。

4.session:

session表示在HTTP会话范围内创建Bean实例。在一次会话期间,只会创建一个Bean实例。如果在同一个会话期间发出多个请求,这些请求都将共享同一个Bean实例。

5.globalsession:

globalsession表示在全局HTTP会话范围内创建Bean实例。这个作用域只适用于基于portlet的Web应用程序。对于其他类型的Web应用程序,globalsession作用域与session作用域是相同的。

二、单例bean与原型bean的区别

如果一个Bean被声明为单例的时候,在处理多次请求的时候在Spring容器里面只实例化出一个Bean,后续的请求都公用这个对象,这个对象会保存到一个map里面。当有请求进来的时候,会先从缓存(map)里查看有没有,有的话直接使用这个对象,没有的话才实例化一个新的对象,所以这是个单例的。但是对于原型(prototype)bean来说,当每次请求进来的时候直接实例化新的bean,没有缓存以及从缓存查的过程。

Spring为什么默认是单例的?

Spring为什么默认是单例的?

 三、单例Bean的优势与劣势

优势:

1、减少了新生成实例的消耗:新生成实例消耗包括两方面,第一,Spring会通过反射或者cglib来生成bean实例,这都是消耗性能的操作,其次给对象分配内存也会涉及复杂算法。

2、减少jvm垃圾回收 :由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。

3、可以快速获取到 bean:因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的,所以很快。

劣势:

单例的 bean一个很大的劣势就是他不能做到线程安全!!!由于所有请求都共享一个 bean实例,所以这个 bean要是有状态的一个 bean的话可能在并发场景下出现问题,而原型的 bean则不会有这样问题(但也有例外,比如他被单例 bean依赖),因为给每个请求都新创建实例。

 文章来源地址https://www.toymoban.com/news/detail-472054.html

到了这里,关于Spring为什么默认是单例的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 我为什么不建议使用框架默认的 DefaultMeterObservationHandler

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~ 另外,本文为了避免抄袭,会在不影响阅读的情

    2024年01月21日
    浏览(55)
  • SpringBoot数据源——为什么平时默认线程池是Hikari

    本文主要对DataSourceAutoConfiguration类进行讲解,然后对这个类的注解做一个解释,所以直接打开这个类,开始看…… ps:我用的版本是2.3.0.RELEASE 目录 DataSourceAutoConfiguration类注解 @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @ConditionalOnMis

    2024年02月06日
    浏览(55)
  • 什么是单例模式

    所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 单例模式有两种方式:1) 饿汉式 2) 懒汉式 演示 饿汉式 和 懒汉式 单例模式的实现。 步骤如下: 构造器私有化 =》 防止其

    2024年02月12日
    浏览(46)
  • 4.14 tcp_tw_reuse 为什么默认是关闭的?

    开启 tcp_tw_reuse 参数可以快速复用处于 TIME_WAIT 状态的 TCP 连接时,相当于缩短了 TIME_WAIT 状态的持续时间。 TIME_WAIT 状态的持续时间是 60 秒,这意味着这 60 秒内,客户端一直会占用着这个端口。端口资源是有限的,一般可以开启的端口为32768-61000。 如果客户端(主动关闭连接

    2024年02月11日
    浏览(35)
  • git将文件或目录添加进了.gitignore文件,为什么不生效?

    如题,之所以将文件添加进了.gitignore文件但不生效,是因为该文件已经被add进git仓库了,已经被git托管了,这时git就没法ignore了。解决办法是先用git rm --cached将这些文件从git仓库中取消托管并提交,然后.gitignore文件才会生效。详细见如下描述。 已经添加到git仓库中的文件,

    2024年02月03日
    浏览(52)
  • 什么是单例模式,如何在Java中实现单例?

    单例模式是一种创建对象的设计模式,它确保只有一个实例,并提供对该实例的全局访问点。在Java中实现单例有懒汉式和饿汉式两种方式。 懒汉式单例模式: 在懒汉式单例模式中,对象创建在第一次使用时才会被创建。例如,当某个类第一次被实例化时,JVM会在堆内存中分

    2024年02月15日
    浏览(56)
  • 什么是 Spring?为什么学它?

    欢迎来到本篇文章!在这里,我将带领大家快速学习 Spring 的基本概念,并解答两个关键问题:什么是 Spring,以及为什么学习 Spring。 废话少说,下面,我们开始吧! Spring 官方文档:https://docs.spring.io/spring-framework/docs/5.2.24.RELEASE/spring-framework-reference/ 简化我们的企业级应用程

    2024年02月06日
    浏览(50)
  • 为什么pycharm远程连接服务器运行时总会出现找不到文件或目录

    目录 解决方法 为什么会出现这样的问题 我们需要修改一个设置 具体步骤如下: 1、右下角点击它,选择interpreter setting  2、进入下图界面,点击箭头所指位置,选择show all 3、进入下图界面,选择你要修改的python interpreter,点哪个🖊进行修改    4、进入下图界面,默认情况下

    2024年02月15日
    浏览(70)
  • Oracle21C:Windows版本的安装、卸载、环境变量配置、避坑指南|ORA-12514|为什么安装目录没有bin目录

    安装Oracle21C(点击下载),因不得其法,各种报错,导致不能正常使用Oracle。  提示:版本是Oracle21C, 其他版本可能存在差异, 目前官网已更新到Oracle23C (进官网后,向下滚动,可下载其他版本)。  1)Oracle下载地址:官网下载页面 2)navecat下载地址:navecate 3)sqlplus下载地

    2024年01月25日
    浏览(56)
  • android studio创建一个新的项目为什么默认是kotlin语言而选择不了java语言

    关于android studio语言选择的问题。 我在进入android studio为什么创建一个新项目之后选择不了java语言有什么办法可以解决。 解决办法:这个模式下选着一个Empty Activity模块就可以使用java语言。 这对于刚刚接触anaroid studio新手比较管用。  

    2024年02月11日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包