1 BeanDefinition 的载入和解析
在完成对 BeanDefinition 的 Resource 定位之后, 我们来了解整个 BeanDefinition 信息的载入过程. 对 IoC 容器来说, 载入过程相当于把定义的 BeanDefinition 在 IoC 容器中转化为一个 Spring 内部表示的数据结构的过程. IoC 容器对 Bean 的管理和依赖注入功能的实现, 是通过对其持有的 BeanDefinition 进行各种骚操作来完成的. 这些 BeanDefinition 数据在 IoC 容器中通过一个 HashMap 来保持和维护.
以 DefaultListableBeanFactory 的设计入手看看 IoC 容器如何完成 BeanDefinition 载入
图 1.1 启动 BeanDefinition 的载入
对于容器的启动, refresh 是一个很重要的方法. 该方法在 AbstractApplicationContext (它是 FileSystemXmlApplicationContext 的基类) 中, 详细地描述了整个 ApplicationContext 的初始化过程, 比如 BeanFactory 的更新, MessageSource 和 PostProcessor 的注册... 看起来像是对 ApplicationContext 进行初始化的模板, 这个执行过程为 Bean 的生命周期管理提供了条件.
图 1.2 对 IoC 容器执行 refresh 的过程
2 BeanDefinition 在 IoC 容器中的注册
BeanDefinition 在 IoC 容器中完成了载入和解析后, 用户定义的 BeanDefinition 信息已经在 IoC 容器内建立起了自己的数据结构以及相应的数据表示, 但此时这些数据还不能供 IoC 容器直接使用, 需要在 IoC 容器中对这些 BeanDefinition 数据进行注册. 这个注册为 IoC 容器提供了更友好的使用方式, 在 DefaultListableBeanFactory 中, 是通过一个 ConcurrentHashMap 来持有载入的 BeanDefinition 的.
图 2.1 DefaultListableBeanFactory 中用于持有 BeanDefinition 的 ConcurrentHashMap
将解析得到的 BeanDefinition 向 IoC 容器中的 beanDefinitionMap 注册的过程是在载入 BeanDefinition 完成后进行的, 注册的调用过程如图
图 2.2 注册的调用过程
BeanDefinition 注册的实现
图 2.3 用于 BeanDefinition 注册的 registerBeanDefinition 方法 (上)
图 2.4 用于 BeanDefinition 注册的 registerBeanDefinition 方法 (下)
图 2.5 registerBeanDefinition 方法的调用关系
完成 BeanDefinition 的注册, 就完成了 IoC 容器的初始化过程. 此时, 在使用的 IoC 容器 DefaultListableBeanFactory 中已经建立了整个 Bean 的配置信息, 而且这些 BeanDefinition 已经可以被容器使用了, 它们都在 beanDefinitionMap 里面被检索和使用. 容器的作用就是对这些信息进行处理和维护.
这些信息是容器建立依赖反转的基础, 有了这些基础数据, 我们下面学习一下在 IoC 容器中, 依赖注入是怎样完成的.
来源: http://www.jianshu.com/p/08b61a681776