XmlBeanFactory继承DefaultListableBeanFactory,关系图以下node
内部经过XmlBeanDefinitionReader来从xml中读取bean的定义,即委托给XmlBeanDefinitionReader,XmlBeanDefinitionReader是读取xml的bean定义,委托实际的xml文档读取给BeanDefinitionDocumentReader,这个类加载一个DOM文档给BeanDefinitionDocumentReader使用,它使用给定的bean的factory注册bean的定义。在XmlBeanFactory初始化时,调用XmlBeanDefinitionReader的loadBeanDefinitions,内部将Resource对象构形成EncodedResource对象。调用loadBeanDefinitions,内部将EncodedResource对象添加到resourcesCurrentlyBeingLoaded线程对象中,经过EncodedResource对象构形成InputSource对象。调用doLoadBeanDefinitions,内部首先初始化Document对象,经过documentLoader构造Document对象,调用registerBeanDefinitions,内部经过BeanDefinitionDocumentReader对象注册bean实例。调用BeanDefinitionDocumentReader的registerBeanDefinitions,BeanDefinitionDocumentReader是BeanDefinitionDocumentReader的默认实现,这个接口根据“spring-beans”DTD and XSD格式(spring默认xml的bean定义格式)读取bean定义,xml文档须要的结构、元素、属性在这个类里硬编码,首先获取Document对象的root,读取root的profile属性,有了这个属性咱们就能够在配置文件中部署两套配置来适用于生产环境和开发环境,这样能够方便地进行切换开发、部署环境,最经常使用的就是更换不一样的数据库。parseBeanDefinitions就是进行xml的读取了。对于根节点或子节点若是是默认命名空间的话则采用parseDefaultElement方法进行解析,不然使用delegate.parseCustomElement方法对自定义命名空间进行解析。而判断是不是默认命名空间仍是自定义命名空间的办法实际上是使用node.getNamespaceURI()获取命名空间,并与spring中固定的命名空间进行比较。parseDefaultElement方法对import、alias、bean、beans标签进行处理。spring
首先咱们对bean标签进行解析,首先委托BeanDefinitionParserDelegate类的parseBeanDefinitionElement方法进行元素解析,返回BeanDefinitionHolder类型的实例bdHolder,通过了这个方法后,bdHolder实例已经包含了咱们配置文件中配置的各类属性了,例如class、name、id、alias之类的属性。当返回bdHolder不空的状况下若存在默认标签的子节点下再有自定义属性,还须要再对自定义标签进行解析,解析完成后,须要对解析后的bdHolder进行注册,一样,注册曹祖委托给了BeanDefinitionReaderUtils的registerBeanDefinition方法,最后发出响应事件,通知相关的监听器,这个bean已经完成加载了。数据库
BeanDefinitionParserDelegate类的parseBeanDefinitionElement提取元素的id及name属性,进一步解析其余全部属性并统一封装至GenericBeanDefinition实例中,若是检测到bean没有指定beanName,那么使用默认规则为bean生成beanName,将获取的信息封装到BeanDefinitionHolder的实例中。parseBeanDefinitionElement方法建立用于承载属性的AbstractBeanDefinition类型的GenericBeanDefinition(Spring经过BeanDefinition将配置文件中的<bean>配置信息转换为容器的内部表示,并将这些BeanDefinition注册到BeanDefinitionRegistry中,这是第一步),而后硬编码解析默认bean的各类属性,解析元数据,解析lookup-method、replaced-method属性,解析构造函数参数,解析property子元素,解析qualifier子元素(这是第二部)。函数