woshiyigemajia1 2009-11-27 16:33
浏览 292
已采纳

关于spring的singleton bean

Spring IoC容器中只会存在一个共享的bean实例,这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。我想知道设计模式中的Singleton模式与spring中的singleton bean之间有什么区别?
还有个比较傻的问题:用户登录后获得一个session,很多用户对bean进行操作,而bean是单例的,那bean对象中的数据岂不是乱了? :oops:

[b]问题补充:[/b]
一楼的朋友好像没有仔细看问题,答非所问啊。
我查资料说,“singleton bean的作用域可以描述为一个container对应一个bean实例”
在问答里也有朋友提出了跟我相似的疑问[url]http://www.iteye.com/problems/27340[/url]
[b]问题补充:[/b]
补充一楼:spring相对于EJB来说“对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。”

那就是说,在classloader中只有一个singleton bean,说的在准确点就是“singleton bean在初始化后只有一个单例存在于spring container中”?

但是资料上说“Spring的singleton bean概念与“四人帮”(GoF)模式一书中定义的Singleton模式是[b]完全不同[/b]的。经典的GoF Singleton模式中所谓的对象范围是指在每一个ClassLoader中指定class创建的实例有且仅有一个。把Spring的singleton作用域描述成一个container对应一个bean实例最为贴切。亦即,假如在单个Spring容器内定义了某个指定class的bean,那么Spring容器将会创建一个且仅有一个由该bean定义指定的类实例。”

它的意思好像是说,在一个ClassLoader中可能有多个container,而一个container中只能有一个singleton bean,我理解的对吗?哪位能再解释下?

[b]问题补充:[/b]
感谢大家的回答,但是分只能给一个人,我觉得heaven的回答我很满意。

  • 写回答

5条回答 默认 最新

  • lijiepeng 2009-11-28 00:27
    关注

    Spring中的singleton的bean与单例对象起到的做用是一持的,
    Spring的singleton参照的是同一IOC容器的单实例,对象在容器中得到缓存;
    单例模式的单实例对象是参照同一Java虚拟机实例,
    它们都是表明在一定范围内只有一个对象实例,只是实现方式不同,但Spring中的singleton对象用了单例模式的好处,而去掉了单例模式的坏处.比如单例模式的类是不可继承的,但Spring的JavaBean不受此限制,等等...
    单实例一般都是无状态的,业务一般都是无状态的,所以可以配置成singleton,并且这有助于对象的重用和节省内存空间的分配.
    当然多个用户操作同一对象,会出现并发问题,解决办法要么是配置成prototype形式的,牺牲空间,要么进行同步,牺牲时间,换取正确性.

    一个虚拟机实例中可以有多个ClassLoader,但一个类型在同一个虚拟机实例中只会被加载一次,只会被一个ClassLoader加载一次,一个容器占有一个虚拟机实例,那么容器中的唯一实例相对虚拟机实例是唯一的这也是成立的.
    但单例模式如果在同一虚拟机实例范围出现第二个实例,这会认为所写的单例类是有缺陷的,但Spring中你配置在容器中的Bean同容器保证它是单实例的,但容器外的你可以再生成此类的第二个,第三个,第N个对象,这是完全可以的, 并且Spring的容易测试性的模拟对象往往都是容器外的对象.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛