Spring启动时,在应用上下文刷新的时候,会开始做xml的解析。
第一步 new
XmlBeanDefinitionReader
再就是获取Xml的配置文件路径循环迭代,
然后将配置文件路径信息解析成一个又一个的Resource对象.
然后通过
DefaultDocumentLoader类去获得 w3c的Document对象.
然后开始去解析xml配置文件.
DefaultBeanDefinitionDocumentReader类呢,是一个比较关键的类,他区分了是解析默认的xml命名空间还是说解析的自定义的命名空间.先往下看.
解析的过程中还会传入new出来的XmlReaderContext对象,具体是啥用途,我们往下看.
解析的过程中,我们还会创建一个BeanDefinitionParserDelegate类
接下来就是比较关键的了,是看解析的xml配置文件是是默认的命名空间呢,以及是自定义的命名空间。(beans即为默认的命名空间除开beans的,比如tx context之类的全是自定义的命名空间)。
默认的命名空间下的,我们会解析的标签是四种<import> ,<alias> ,<bean> 以及<beans>.
解析自定义的命名空间的xml配置文件的话,我们是根据namespaceUri获取到对应的NamespaceHandler,然后再在NamespaceHandler类中,获取BeanDefinitionParser用于对特定的标签来进行解析.那么是如何获得BeanDefinitionParser呢,其实就是从一个Map对象里get出来的.
map对象的注入时机的话,比如:
很熟悉吧,上面的代码,都是xml里的标签的元素名.