

Spring 为啥默认把bean设计成单例的?这篇讲的明明白白的
source link: http://mp.weixin.qq.com/s?__biz=MzIzMTE1ODkyNQ%3D%3D&%3Bmid=2649413528&%3Bidx=1&%3Bsn=e400a5b98fce14f789f5b141f940e4b9
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者:小小木
juejin.im/post/5cab7ebf518825177637b2f9
熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton、prototype、request、session、global session。
如下图是官方文档上的截图,感兴趣的朋友可以进去看看这五种分别有什么不同。今天要介绍的是这五种中的前两种,也是Spring最初提供的bean scope singleton 和 prototype。
Spring官方文档介绍如下图:
更多内容可以看官方文档介绍,非常详细:
https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
单例bean与原型bean的区别
如果一个bean被声明为单例的时候,在处理多次请求的时候在Spring容器里只实例化出一个bean,后续的请求都公用这个对象,这个对象会保存在一个map里面。当有请求来的时候会先从缓存(map)里查看有没有,有的话直接使用这个对象,没有的话才实例化一个新的对象,所以这是个单例的。但是对于原型(prototype)bean来说当每次请求来的时候直接实例化新的bean,没有缓存以及从缓存查的过程。
1.画图分析
2.源码分析
生成bean时先判断单例的还是原型的
如果是单例的则先尝试从缓存里获取,没有在新创建
结论:
-
单例的bean只有第一次创建新的bean 后面都会复用该bean,所以不会频繁创建对象。
-
原型的bean每次都会新创建
单例bean的优势
由于不会每次都新创建新对象所以有一下几个性能上的优势:
1.减少了新生成实例的消耗
新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。
2.减少jvm垃圾回收
由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。
3.可以快速获取到bean
因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。
有关bean实例化相关可以看着篇文章:
https://juejin.im/post/5ca42bfa6fb9a05e17799e07
单例bean的劣势
单例的bean一个很大的劣势就是他不能做到线程安全!!!,由于所有请求都共享一个bean实例,所以这个bean要是有状态的一个bean的话可能在并发场景下出现问题,而原型的bean则不会有这样问题(但也有例外,比如他被单例bean依赖),因为给每个请求都新创建实例。关于这方面我正在准备写一篇文章,在整理当中,感兴趣的朋友可以关注我,我后续写一篇详细的文章。
总结
Spring 为啥把bean默认设计成单例?
答案:为了提高性能!!!从几个方面,
-
少创建实例
-
垃圾回收
-
缓存快速获取
单例有啥劣势?
如果是有状态的话在并发环境下线程不安全
Recommend
-
53
编者按:这篇文章提纲挈领地总结了极简主义设计的一些特点,不妨借此机会把关于极简主义设计的文章都梳理到一起,系统化地学习一下。一篇文章,...
-
67
'李克强在批示中要求,国务院要立刻派出调查组,对所有疫苗生产、销售等全流程全链条进行彻查,尽快查清事实真相,不论涉及到哪些企业、哪些人都坚决严惩不贷、绝不姑息。对一切危害人民生命安全的违法犯罪行为坚决重拳打击,对不法分子坚决依法严惩,...
-
62
国家药监局已对长生生物立案调查
-
60
【柳传志和于谦说相声】@啄啊啄啊啄沪沪:谦大爷:任谁站桌子外头我都能给你量的明明白白的
-
55
为啥HashMap的默认容量是16?集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生。 在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map<String, String>...
-
9
ZKSwap 与 SofaSwap 达成单币种质押合作,即将开启交易合作后用户可将在 SofaSwap 上使用 ZKS 开主流币合约 (如 BTC、ETH 等),结算币种为做市商 LP 抵押的包含 ZKS 在内的任意数字资产。…· 23 分钟前2021 年 9...
-
5
一加新专利曝光:可将多格漫画裁成单格播放 10月21日消息,近日,一加手机关联公司深圳市万普拉斯科技有限公司申请的“一种漫画播放方法、...
-
8
V2EX › 分享发现 把双显示器升级成单显示器 LG C2,太舒服了
-
5
我们都知道 Spock 是一个单测框架,其特点是语法简明。但当我们使用 Spock 写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?一般来说,我们会使用两个插件来一起完成单测覆盖率报告的生成,分别是:Maven Surefire PluginJaCoCo Plugin...
-
5
V2EX › 问与答 程序员开发笔记本-mac 或联想拯救者系列改成单系统 ubuntu
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK