论坛首页 入门技术论坛

spring加载singleton Bean的时候,发现两个实例。

浏览 3408 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-03  
目的:想在内存中加载一个单态队列。
做法:该队列做为spring的一个singleton Bean加载到Spring Container当中,在业务逻辑中,将对象装在单态队列中,获取队列中的元素是在Servlet中获取的,Servlet也是通过Spring DI得到的这个队列。
问题:但是这两个队列并不一样,前者在队列中装了一些元素,后者得到的队列却不包含任何元素。不知道是为什么,难道Spring Container和Servlet Container是分开的吗?

参考:看了一下spring的references,是这样说的:
Please be aware that Spring's concept of a singleton bean is quite different from the Singleton pattern as defined
in the seminal Gang of Four (GoF) patterns book. The classic GoF Singleton hardcodes the scope of an object
such that one and only one instance of a particular class will ever be created per ClassLoader. The scope of the
Spring singleton is best described as per container and per bean. This means that if you define one bean for a
particular class in a single Spring container, then the Spring container will create one and only one instance of
the class defined by that bean definition.
   发表时间:2007-07-04  
问题阐述的不清楚吗?怎么没有一个人回帖的。
0 请登录后投票
   发表时间:2007-07-04  
问题解决了,自问自答吧。
关于spring的singleton pattern的问题有一篇文章介绍的挺好,http://www.digizenstudio.com/blog/2006/09/14/a-spring-singleton-is-not-a-singleton/  这里说spring singleton is not a singleton是指spring的单态和GOF的单态是不同的,spring的单态只是在spring容器里边保存一个实例,但是如果有
      <bean id="foo1" class="Foo" singleton="true">
      </bean>
      <bean id="foo2" class="Foo" singleton="true">
      </bean>

则在容器中建立两个实例,显然和GOF的单态是不同的,GOF的单态只要保证是一个ClassLodader,那么其中对应每一个类就仅有一个实例。

所以决定将项目中的队列改成GOF的单态模式,去掉spring的DI,然后发现两次访问队列还不是一个实例,而此时的ClassLoader是相同的,再检查spirng的配置文件,发现有对队列Bean的定义,去掉之后,解决问题。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics