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容器中,依赖注入是怎样完成的.
作者:芥末无疆sss
链接:https://www.jianshu.com/p/08b61a681776
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。