⑩③. 接下来继续跟踪debug堆栈–如上图,继续来进行加载,InputSource它把所有的资源拿过来,准备好以后有一个方法叫doLoadBeanDefinitions,就是层层加载,然后继续下边跟踪堆栈-入下图,有一个叫registerBeanDefinitions,这个registerBeanDefinitions方法里面传入了一个doc,事实上它最后引入了第三方的dom解析工具来把整个xml配置变成一个Document文档 也就是org.w3c.dom,这一块Document文档的流程大概了解下就行了
⑩④. BeanDefinitionReader利用dom解析把xml成Document文档对象,然后再把Document文档对象再交给BeanDefinitionDocumentReader
⑩⑤. 继续跟踪堆栈–下图所示,这是以下步骤的堆栈,就不一一带着来研究堆栈的细节了:然后BeanDefinitionDocumentReader再负责把Document文档对象交给BeanDefinitionParserDelegate(Bean定义解析器委托)
⑩⑥. 最终BeanDefinitionParserDelegate(Bean定义解析器委托)把Document文档对象解析成BeanDefinition,这里面也就利用了解释器模式
xml的所有信息解析完的信息并封装在了BeanDefinitionHolder(bean定义信息的持有)中
public class BeanDefinitionHolder implements BeanMetadataElement { private final BeanDefinition beanDefinition; private final String beanName; }
⑩⑦. beanDefinition和beanname这两个玩意要注册到档案馆里面,它就为了方便,就先封装到了这个BeanDefinitionHolder(bean定义信息的持有)
⑩⑧. 然后就再注册这个玩意,直接拿到BeanDefinitionRegistry(bean定义信息的注册中心),给这个注册中心里面利用registerBeanDefinition这个方法进行注册,那它如何注册的?
在DefaultListableBeanFactory对信息进行校验,验证成功以后,再来看这个beanDefinitionMap.get (beanName);里面有没有这个bean的名字
Spring的底层大量使用到了这样的写法,想要给容器里面注册一个定义信息,但是先上来检查beanDefinitionMap里面有没有,没有才进行注册
也就是说现在是逐行解析,解析到每一个bean,解析成了以后,就要把它注册到档案馆
(DefaultListableBeanFactory)里面,然后先检查档案馆(beanDefinitionMap)里面有没有
如果没有就注册进去,如果有就不用注册了,至此就把整个注册流程就了解清楚了