论坛首页 入门讨论版

Spring到底是如何产生Bean实例的?只是反射?

浏览 228 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-04-28 关键字: spring
以前总以为Spring的IoC没什么神奇的,只是读取xml,然后利用反射产生实例而已。

昨天看到Spring可以控制生产的实例是Singleton还是Prototype,我就在想,如果我的Bean类是一个单例类,能不能产生多个实例?于是我试着把这个构造方法私有化的Bean配置成Prototype,调用两次ApplicationContext.getBean(String name),分别赋值给两个变量,再用“==”比较这两个变量,运行之前我以为会抛出异常,结果不但正常运行,输出结果居然还是false。

接着我自己试着用反射来产生这个Bean的实例,却被告知无法访问private修饰的成员。

然后我开始翻Spring的源代码,从ClassPathXmlApplicationContext开始找,没发现getBean方法,于是去它的父类AbstractXmlApplicationContext里面找,再到AbstractRefreshableApplicationContext -> AbstractApplicationContext ,有了!
return getBeanFactory().getBean(name);

public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;


然后打开API文档,看到AbstractApplicationContext 的实现类有两个:AbstractRefreshableApplicationContext, GenericApplicationContext,然后分别去这两个类里面找getBeanFactory()……绕来绕去,绕到最后还是没找着。

顺便请教一下,大家看开源框架的源代码是怎么看的?要都像我这样看不得累死。。。
   
最后更新时间:2008-04-28
累死才能学到东西
   
0 请登录后投票
最后更新时间:2008-04-28
实际上IOC会用到proxy,也就是java中动态代理,你可以看一些动态代理的资料
   
0 请登录后投票
最后更新时间:2008-04-28
麦田守望者 写道
实际上IOC会用到proxy,也就是java中动态代理,你可以看一些动态代理的资料

那是AOP吧?

这个问题搞定了,确实是反射,Constructor.setAccessable(true)之后再调用Constructor.newInstance(Object[] args),唉,是我基础不行。
   
0 请登录后投票
论坛首页 入门讨论版

跳转论坛:
JavaEye推荐