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 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有