铺垫
(备注:上面提及的 FileSystemResource 以及 BeanDefinition如有不清楚,请阅读我上一篇文章:spring源码之IOC容器资源定位过程)
资源定位完成并获取到对应的资源解析条件后,spring将会对获取到的资源进行解析,并且将解析后的抽象数据结构注册到IoC容器中。
那我们接下来就来看看spring 对 :
BeanDefinition的载入
BeanDefinition的注册
这两步的处理过程在复杂的容器继承层级中的处理过程是怎么样的呢?下面我们就来简单讲讲
正文
在资源定位成功后,通过实现原理的分析,我们可以看到,在初始化FileSystemXmlApplicationContext的过程中,是通过XmlBeanDefinitionReader来读取资源的,并委托它来完成具体的载入以及解析过程,由于我们这里使用的是XML方式定义的资源文件,所以需要使用XmlBeanDefinitionReader,如果使用了其他的BeanDefinition,就需要用其他种类的BeanDefinitionReader来完成数据的载入工作了。
对于BeanDefinition的载入和解析工作的开始是从AbstractXmlApplicationContext类中的loadBeanDefinitions方法中调用的reader的loadBeanDefinitions方法开始的。接下来的调用流程我还是和以前一样整理成了一个调用的流程图,并在各个调用节点备注了调用方法的作用,可以根据这个流程图到源码环境细看情况,同时这个流程也梳理出了一个比较清晰的思路,便于理解。(可以保存到手机哦。说不定面试会用到)如下图:
总结
经过解析,我们在xml文件定义的配置文件被解析成一个抽象的数据结构BeanDefinition数据结构,通过AbstractBeanDefinition为入口,让Ioc容器执行索引、查询和操作。Ioc容器大致完成了管理Bean的数据准备工作,但是这个时候依赖注入实际上还没发生,在此时容器也并没有完全起作用,现在BeanDefinition中的只是一些静态的配置信息,要想完全发挥容器的作用,还需要完成对数据想容器中注册。
这个注册为Ioc容器提供了更好的使用方式,可以在DefaultListableBeanFactory类中看到,容器其实是用ConcurrentHashMap来持有BeanDefinition的,同时容器对这些信息进行处理和维护。
此篇文章和上篇文章(spring源码之IOC容器资源定位过程)就是我阅读spring Ioc容器对资源定位o,加载和注册的整调用流程的记录。很明显这两篇文章只是讲了大概的思路,具体的内容还需要具体在搭建源码环境后阅读。
肯定会有同学说,咦~,IoC容器的一些比较厉害的特性你咋没写处理呢?
对于依赖注入、aop实现、事务特性,如果在同一篇文章写,可能会显得思路不是很清晰,所以后面我会一一出我的记录笔记,预知下文,可以关注小弟的公众号一起同探讨学习哈。
看完文章啦?听首歌吧~(我还年轻我还年轻),不要忘记关注哦~
公众号只做学习、记录和交流,偶尔推推一些笔者觉得比较好听的歌---- rofeya