Spring的BeanFactory体系结构(三) – DefaultSingletonBeanRegistry

接着上面SimpleAliasRegistrt的学习。今天,接着学习 DefaultSingletonBeanRegistry。

一听名字,就知道这是一个SingletonBean注册的地方,此类也实现了SingletonBeanRegistry接口,继承了SimpleAliasRegistry。这也可以理解,DefaultSingletonBeanRegistry既有管理SingletonBean的功能,又提供了别名的功能,那当然可以继承SimpleAliasRegistry了。

DefaultSingletonBeanRegistry是一个通用的存储共享bean实例的地方,通过bean的名字获得bean。同时,它也给提供一次性bean的注册功能。

这个类的主要作用是,给BeanFactory的实现,提供基本的管理 singleton bean 实例功能。

这个类中,使用了三个主要的存储器(map)来分别存储 singletonObject,singletonFactory,earlySingletonObject。

当注册一个 singleton object 的时候,会在 singletonObject 的存储器中加入此 object,而在其他的两个存储器中移除。当然,这样的行为是可以在子类中去复写的。

在 getSingleton的时候,spring的默认实现是,先从 singleton object 的存储器中去寻找,如果找不到,再从 early singleton object 存储器中寻找,再找不到,那就在寻找对应的 singleton factory,造出所需的 singleton object,然后返回。

而 contains singleton 就是直接检查 singleton object 存储器了,其他的存储器不做检查。

而 get singleton counts 也是统计 singleton object 的数量。

看完了代码,再仔细想想,为什么这个类要使用三个存储器呢?

我想, singletonObjects 就是直观的存储着 singleton 的,而 singletonFactories 是存储的制造 singleton 的工厂,还有一个 earlySingletonObject, 在看了代码之后,我更觉得这是一个 singletonFactory 制造出来的 singleton 的缓存。

个人感觉,看spring,就像读一篇很好的文章,非常的流畅,而且也很值得细细品味。

相关文章

This entry was posted in Java, Spring and tagged , , , . Bookmark the permalink.

One Response to Spring的BeanFactory体系结构(三) – DefaultSingletonBeanRegistry

  1. khotyn says:

    earlySingletonObjects一直搞不懂是干什么用的,这里说用来作为singletonFactory的缓存,还是比较有道理的。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>