Spring学习笔记:Spring Bean的作用域

Spring Bean的作用域有singleton、prototype、request、session、application、websocket。


image.png

singleton

singleton就是常见的单例模式的一种实现,默认情况下bean的作用域就是singleton,所以无需做任何配置。
需要注意的是这里所指的单例并不是应用程序中的单例,而是在当前bean容器中是单例的。当bean被定义为单例时,spring容器中会共享这个bean实例。


image.png

prototype

当bean的scope设定为prototype时,如果这个bean需要被引用(注入到某个bean中或者被getBean()方式查找),spring容器都会根据当前bean定义创建一个全新的bean实例对象返回。


image.png

实现方式

  1. 通过xml配置
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
  1. 通过@Scope
 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  1. 通过BeanDefinitionBuilder#setScope
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition (User.class);
        builder.addPropertyValue ("name", "bd-user")
                .setScope (BeanDefinition.SCOPE_PROTOTYPE);

request & session & application

这几个作用域只能web环境中有效,如果是在非web的spring环境使用这些作用域,容器会抛出IllegalStateException。

request

被定义成request作用域,即每次请求都会创建一个新的bean实例。

session

被定义成session作用域,即在同一个session环境中共享bean实例

application

被定义成application作用域,即在servlet上下文环境中共享bean实例

singleton类型bean注入prototype类型bean问题

因为bean的依赖关系是在实例化时解析完成的,所以singleton类型bean中的注入prototype类型bean的过程也是只有一次,那么其实每次使用的都是同一个prototype类型bean对象。
如果想singleton类型bean在运行时重新获取新的prototype类型bean实例,spring提供了method injection的方式解决这个问题 【方法注入非这次的学习重点,暂不过多论述】。

源码解析

源码入口,作用域判断的主要逻辑在AbstractBeanFactory的doGetBean:

//调用栈
AbstractApplicationContext#refresh
->AbstractApplicationContext#finishBeanFactoryInitialization
->AbstractApplicationContext#preInstantiateSingletons
->DefaultListableBeanFactory#preInstantiateSingletons
->AbstractBeanFactory#getBean
->AbstractBeanFactory#doGetBean
  • 下图是作用域为Singleton的处理入口


    singleton作用域处理逻辑.png
  • 下图是作用域为Prototype的处理入口


    prototype作用域处理逻辑.png
  • 下图是其他作用域的处理入口,如request、session、application、websocket、自定义作用域


    其他作用域处理逻辑.png

request&session的处理入口

  • request和session的处理入口是AbstractRequestAttributesScope#get


    request和session的处理逻辑

application的处理入口

  • application的处理入口时ServletContextScope#get


    image.png

参考文档

Bean Scopes官方说明

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容