Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

前言

在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext
为例,跟进代码,看看 IoC 的启动流程。
入口
从 JavaConfig 中加载配置的 AnnotationConfigApplicationContext
启动方式如下:

进去之后发现构造其实是调用的当前无参构造。

所以在启动时也可以直接声明无参构造,改写为下面这种:
今天就研究研究无参构造这一部分究竟做了什么逻辑!
无参构造

其中的 StartupStep
是 5.3 新增的类,看代码注释的意思是:表示用来记录启动过程中的一些指标信息等。暂时不做研究。
主要研究红框部分!注意,这一块并不代表只有红框部分!

因为 AnnotationConfigApplicationContext
继承了 GenericApplicationContext
,所以会先执行父类的构造方法。

所以这里会创建一个 DefaultListableBeanFactory
的容器。
DefaultListableBeanFactory

虽然说 Spring 的 BeanFactory
定义了容器的基础概念、接口方法等,但是 DefaultListableBeanFactory
才是一个真正可以 new 出来的具体的容器,当然也可以暂且称之为 bean 工厂。
下面来看一下 DefaultListableBeanFactory
里面都有什么?

在 DefaultListableBeanFactory
里面会初始化很多参数,其中重点关注的是下面两个参数:
其中 BeanDefinition
描述了一个 bean 实例,该实例具有属性值,构造函数参数值以及具体实现所提供的更多信息。
对应的 beanDefinitionMap
就是存储的初始化的 beanName 和 BeanDefinition。
至于 BeanDefinition 具体内容,下一节再做介绍。
总结
通过上面的阅读,可以在初始化流程中增加一部分模块,即实例化 DefaultListableBeanFactory

再回顾一下 DefaultListableBeanFactory
的概念。
>DefaultListableBeanFactory:
>
>Spring 的 ConfigurableListableBeanFactory 和 BeanDefinitionRegistry 接口的默认实现:基于bean定义元数据的成熟bean工厂,可通过后处理器进行扩展。
>重点需要把握的是 DefaultListableBeanFactory 内部定义了 BeanDefinition 的 Map。
结束语
本文从入口开始,进入到构造,主要介绍了 DefaultListableBeanFactory
的创建,及创建时初始化了一堆参数。
考虑到文章篇幅问题,尽量避免大段大段的贴代码以及注释,有兴趣的小伙伴可以试着自己搭建源码构建环境,然后 Debug 走一走,这样也可以互相探讨,共同学习。
笔者也是刚开始阅读学习源码,不足之处,希望多多指正。
相关推荐
版权声明: 本文为 InfoQ 作者【程序员小航】的原创文章。
原文链接:【http://xie.infoq.cn/article/571e8a9c685f9f92baf832b63】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论