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 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64