继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

IoC容器初始化过程(下)

蝴蝶不菲
关注TA
已关注
手记 372
粉丝 81
获赞 381

1 BeanDefinition的载入和解析

在完成对 BeanDefinition  Resource 定位之后,我们来了解整个 BeanDefinition 信息的载入过程.对IoC容器来说,载入过程相当于把定义的 BeanDefinition 在IoC容器中转化为一个Spring内部表示的数据结构的过程.IoC容器对Bean的管理和依赖注入功能的实现,是通过对其持有的BeanDefinition 进行各种骚操作来完成的.这些 BeanDefinition 数据在IoC容器中通过一个 HashMap 来保持和维护.

 DefaultListableBeanFactory 的设计入手看看IoC容器如何完成 BeanDefinition 载入

5bdc32b20001d90110000182.jpg

图1.1 启动BeanDefinition的载入

对于容器的启动, refresh 是一个很重要的方法.该方法在 AbstractApplicationContext (它是 FileSystemXmlApplicationContext 的基类)中,详细地描述了整个 ApplicationContext 的初始化过程,比如 BeanFactory 的更新, MessageSource PostProcessor 的注册...看起来像是对ApplicationContext 进行初始化的模板,这个执行过程为Bean的生命周期管理提供了条件. 

5bdc32b300015a5910000859.jpg

图1.2 对IoC容器执行refresh的过程

2 BeanDefinition在IoC容器中的注册

BeanDefinition 在IoC容器中完成了载入和解析后,用户定义的 BeanDefinition 信息已经在IoC容器内建立起了自己的数据结构以及相应的数据表示,但此时这些数据还不能供IoC容器直接使用,需要在IoC容器中对这些 BeanDefinition 数据进行注册.这个注册为IoC容器提供了更友好的使用方式,在 DefaultListableBeanFactory 中,是通过一个 ConcurrentHashMap 来持有载入的 BeanDefinition 的.

5bdc32b30001efc010000045.jpg

图2.1  DefaultListableBeanFactory中用于持有BeanDefinition的ConcurrentHashMap

将解析得到的 BeanDefinition 向IoC容器中的 beanDefinitionMap 注册的过程是在载入 BeanDefinition 完成后进行的,注册的调用过程如图


5bdc32b300016f9902790181.jpg

图2.2 注册的调用过程

BeanDefinition 注册的实现


5bdc32b40001634a10000736.jpg

图2.3 用于BeanDefinition注册的registerBeanDefinition方法(上)

5bdc32b5000152e210000742.jpg

图2.4 用于BeanDefinition注册的registerBeanDefinition方法(下)


5bdc32b50001c6a710000395.jpg

图2.5 registerBeanDefinition方法的调用关系

完成 BeanDefinition 的注册,就完成了IoC容器的初始化过程.此时,在使用的IoC容器 DefaultListableBeanFactory 中已经建立了整个 Bean 的配置信息,而且这些 BeanDefinition 已经可以被容器使用了,它们都在 beanDefinitionMap 里面被检索和使用.容器的作用就是对这些信息进行处理和维护.

这些信息是容器建立依赖反转的基础,有了这些基础数据,我们下面学习一下在IoC容器中,依赖注入是怎样完成的.



作者:芥末无疆sss
链接:https://www.jianshu.com/p/08b61a681776
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP