浅谈spring中的Singleton

首先让我们看看一个Bean是怎么样通过Spring实例化的例子:
action-servlet.xml

<bean id="foo" class="foo" singleton="true">
  <property  ……
</bean>


当singleton="true"的时候,这个属性使spring所做的是,通过缓冲使所有对这个Bean的请求返回相同的一个类实例。而相对比较传统的java类实例化而言,这里有俩个不相同的地方值得注意:

1、这些缓冲中Bean类实例仅仅是发生在一个单独的spring全局的上下文实例化中的一个——这个涉及到Spring的反转控制容器,具体参考Spring说明文档。因此,当我们又有一个Bean定义在相同的id和相同的类在不相同的上下文实例化中,很显然这个Bean就是一个完全不相同的另一个Bean。(注意:这里我们所讲的applicationContext上下文实例话不是定义在XML文件的关系上下文,因为多个的xml文件可以加载到一个(applicationContext)上下文关系,而我们更关心的是singeton的范围,即一个实例而不是这个singleton的位置)相反,我们再看看一个单独的java实例,这个单独的实例化是在某个类在加载它的时候给它设置成一个全局的实例。 

2、当一个Bean涉及到有一个来自上下文的请求的时候,这个Bean的读取就根据配置中的id或名字来辨别你所想要加载的Bean实例。从令一个角度来说,我们加载这个我们想要得Bean是通过目录似的的读取方法而获取的——Bar.getInstance()。这听起来好像没有多大意义,但考虑一下,当有相同的类名定义在一个相同的上下文关系,将会出现怎么样的情况呢?

<bean id="foo1" class="foo" singleton="true">
  <property  ……
</bean>
<bean id="foo2" class="foo" singleton="true">
  <property  ……
</bean>

 这样就会有俩个的Bean实例创建在上下文中,而这俩个Bean的实例类型都是foo,但一个是通过foo1来访问的,另一个则是通过foo2。很明显在传统的java类单独实例化是从来没有见过的。

 已经注意到上面的俩个区别后,在spring中的单个实例化的概念与传统中那些直交的java类实例化相比更加清晰——所谓“直交”是指相对于spring的实例化,既不是在基于定义在范围内的单一的spring实例化,也不是关联到其他对象类的单一的实例化。从另一方面来说,我们所看到的spring单个实例化是拥有俩个基本角色的传统单个实例化。

很庆幸的是,这个迷惑将会在Spring的2.0中的扩展中以“scope”的方式的属性和缓冲,请求,及全局缓冲进行介绍,从而更加清晰。在Spring  2.0的文档说明中第3.4部分的(Bean scope)对象周期中,明确的提出了单个实例化在spring中与在传统的单个的java实例化中是不同的警示。

然而,我仍然觉得他应该使这个事件有一个完整的流程过程,使这个所谓的周期值“单个”实例Bean重新起名完全像“容器”一样——但这样一来,我又看到了另一方面的迷惑,比如“从上文到这个实例是怎么样来支持映射关系呢?” 



~~~引用通告地址http://www.digizenstudio.com/blog/2006/09/14/a-spring-singleton-is-not-a-singleton 

转自:http://www.saiiling.cn/article.asp?id=103

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值