返回列表 发帖

Spring中scope="singleton"的bean在底层是怎么维护的

今天去一个公司,和他们技术经理聊天的时候。从他口中听到一个另我非常不认同的说法。
他说:scope="singleton"的bean在底层是像连接池一样。维护一堆一样的bean实例。getBean的时候是从其中拿一个出来。维护的时候是一起维护的。因为我却是没有研究过spring的源码。当时我只是敷衍过去。
但回来以后,我写代码测试,更加不让我不能认同他的说法。
如下:
package org.bruce.zzzspringdemo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Door {
public static void main(String[] args) {
  ApplicationContext ctx = new ClassPathXmlApplicationContext(
    "org/bruce/zzzspringdemo/config/application.xml");
  Person person = (Person) ctx.getBean("person");
  System.out.println(person + "原始person的name是:" + person.getName());
  person.setName("bruce.ye");
  for (int i = 10; i <= 100; i++) {
   person = (Person) ctx.getBean("person");
   System.out.println(person + "第" + i
     + "次获取person的name是:"
     + person.getName());
  }
}
}
打印出来的实例地址每次都是一样的。
按照他的说法,总不至于,这么幸运,每次在那么多中都获取一个吧。name也是一样的。
各位能帮我解惑吗?

不是这样的。
对于singleton Bean,容器在底层只维护一个实例。
如果使用ApplicationContext作为容器,这个Bean在容器创建时就生成了(如果没有设置延迟加载!),以后永远不会再生成。
这在Bean生命周期中有很清楚的说明。

如果使用BeanFactory作为容器,则在该Bean第一次被请求时,该Bean被创建,创建后一直保持这个Bean实例。

通过查看Spring源代码可以看的非常清楚。

如果你用Eclipse,你可以使用Eclipse的断点跟踪工具,看到Spring一步一步的动作!!

实际上,很多所谓技术经理喜欢信口开河!
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

我也是没有研究过spring的源码, 又学到东西了

TOP

我一直想研究一下spring的源码,请问应该从哪里开始看呢?

TOP

原来我是对的。差点又被人忽悠了。ЯЭ

TOP

原帖由 codyyu 于 2008-6-12 20:43 发表
我一直想研究一下spring的源码,请问应该从哪里开始看呢?


下载spring, 里面就有源代码了

TOP

回复 6# 杨恩雄 的帖子

师兄,你好,我的意思是应该从哪里入手呢?

TOP

原帖由 codyyu 于 2008-6-14 18:17 发表
师兄,你好,我的意思是应该从哪里入手呢?


个人觉得,没有必要全面研究它的源代码。
Spring容器最大的两个功能:IoC、AOP。
你可以尝试自己写类似的容器——当你遇到问题时,用Eclipse、JBuilder创建Spring
容器,然后用断点调试——>步进(step in)跟踪Spring代码即可。
解决问题后,继续写你自己的——遇到问题,再次重复以上步骤。
——经过多次重复后,你再次去模拟其他框架时,会遇到越来越少问题的。

以上纯属个人见解,这样做的后果可能会扼杀你的创造力,
比如我,就缺乏自己创造框架的功底。

[ 本帖最后由 kongyeeku 于 2008-6-14 19:19 编辑 ]
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

scope为singleton或prototype时,不就是单态模式么?何来的一堆?

TOP

牛同学,
如果为prototype就不是单例了,你口误了吧。
如果为prototype将会在每次被请求时都new一个Bean实例。
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

返回列表