继续回到XmlBeanDefinitionReader 的loadBeanDefinitions(Resource …)方法看到代表bean 文件的资源定义以后的载入过程。

//XmlBeanDefinitionReader加载资源的入口方法
@Override
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {//将读入的XML资源进行特殊编码处理return loadBeanDefinitions(new EncodedResource(resource));
}//这里是载入XML形式Bean定义资源文件方法
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {Assert.notNull(encodedResource, "EncodedResource must not be null");if (logger.isInfoEnabled()) {logger.info("Loading XML bean definitions from " + encodedResource.getResource());}Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();if (currentResources == null) {currentResources = new HashSet<>(4);this.resourcesCurrentlyBeingLoaded.set(currentResources);}if (!currentResources.add(encodedResource)) {throw new BeanDefinitionStoreException("Detected cyclic loading of " + encodedResource + " - check your import definitions!");}try {//将资源文件转为InputStream的IO流InputStream inputStream = encodedResource.getResource().getInputStream();try {//从InputStream中得到XML的解析源InputSource inputSource = new InputSource(inputStream);if (encodedResource.getEncoding() != null) {inputSource.setEncoding(encodedResource.getEncoding());}//这里是具体的读取过程return doLoadBeanDefinitions(inputSource, encodedResource.getResource());}finally {//关闭从Resource中得到的IO流inputStream.close();}}catch (IOException ex) {throw new BeanDefinitionStoreException("IOException parsing XML document from " + encodedResource.getResource(), ex);}finally {currentResources.remove(encodedResource);if (currentResources.isEmpty()) {this.resourcesCurrentlyBeingLoaded.remove();}}
}
//从特定XML文件中实际载入Bean定义资源的方法
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)throws BeanDefinitionStoreException {try {//将XML文件转换为DOM对象,解析过程由documentLoader实现Document doc = doLoadDocument(inputSource, resource);//这里是启动对Bean定义解析的详细过程,该解析过程会用到Spring的Bean配置规则return registerBeanDefinitions(doc, resource);}catch (BeanDefinitionStoreException ex) {throw ex;}catch (SAXParseException ex) {throw new XmlBeanDefinitionStoreException(resource.getDescription(),"Line " + ex.getLineNumber() + " in XML document from " + resource + " is invalid", ex);}catch (SAXException ex) {throw new XmlBeanDefinitionStoreException(resource.getDescription(),"XML document from " + resource + " is invalid", ex);}catch (ParserConfigurationException ex) {throw new BeanDefinitionStoreException(resource.getDescription(),"Parser configuration exception parsing XML from " + resource, ex);}catch (IOException ex) {throw new BeanDefinitionStoreException(resource.getDescription(),"IOException parsing XML document from " + resource, ex);}catch (Throwable ex) {throw new BeanDefinitionStoreException(resource.getDescription(),"Unexpected exception parsing XML document from " + resource, ex);}
}

通过源码分析,载入Bean 配置信息的最后一步是将Bean 配置信息转换为Document 对象,该过程由documentLoader()方法实现。

基于Xml 的IOC 容器-开始读取配置内容相关推荐

  1. 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  2. 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化

    IOC 容器的初始化包括 BeanDefinition 的 Resource 定位.加载和注册这三个基本的过程. 我们以ApplicationContext 为例讲解,ApplicationConte ...

  3. 基于Xml 的IOC 容器-载入<list>的子元素

    在BeanDefinitionParserDelegate 类中的parseListElement()方法就是具体实现解析<property>元素中的<list>集合子元素,源 ...

  4. 基于Xml 的IOC 容器-开始启动

    SpringIOC 容器对Bean 配置资源的载入是从refresh()函数开始的,refresh()是一个模板方法,规定了IOC 容器的启动流程, 有些逻辑要交给其子类去实现.它对Bean 配置资源 ...

  5. 基于Xml 的IOC 容器-获得配置路径

    通过分析ClassPathXmlApplicationContext 的源代码可以知道, 在创建ClassPathXmlApplicationContext 容器时,构造方法做以下两项重要工作: 首先 ...

  6. 基于Xml 的IOC 容器-将配置载入内存

    BeanDefinitionDocumentReader 接口通过registerBeanDefinitions() 方法调用其实现类DefaultBeanDefinitionDocumentRead ...

  7. 基于Xml 的IOC 容器-载入<bean>元素

    Bean 配置信息中的<import>和<alias>元素解析在DefaultBeanDefinitionDocumentReader 中已经完成,对Bean 配置信息中使用最 ...

  8. 基于Xml 的IOC 容器-分配解析策略

    XmlBeanDefinitionReader 类中的doLoadBeanDefinition()方法是从特定XML 文件中实际载入Bean 配置资源的方法,该方法在载入Bean 配置资源之后将其转换 ...

  9. 基于Xml 的IOC 容器-准备文档对象

    DocumentLoader 将Bean 配置资源转换成Document 对象的源码如下: //使用标准的JAXP将载入的Bean定义资源转换成document对象 @Override public ...

最新文章

  1. ARP命令详解--网络命令详解二
  2. docker 上下文环境 忽略文件 .dockerignore 简介
  3. 面象对象设计6大原则之三:里氏替换原则
  4. 【设计模式:单例模式】单例模式01:饿汉模式
  5. Java Web学习总结(12)——使用Session防止表单重复提交
  6. C#程序设计语言2.0简介
  7. mysql批量导入csv数据_csv批量导入mysql命令
  8. 风控建模一、初步认识风控
  9. VisionPro工具说明
  10. 测试用例的粒度和评价
  11. Latex中PDF文档目录乱码解决方案
  12. LeetCode-704.二分查找
  13. 如何将py文件转化为exe
  14. java在线截图_JAVA之网页截屏
  15. React 中的“栈调和”(Stack Reconciler)过程是怎样的?
  16. QQ邮箱测试域用户密码过期邮件提示
  17. 查看虚拟机vmware下linux的ip
  18. ac68u、r8500 梅林固件扩展为一个小型 linux 系统
  19. 音视频技术开发周刊 79期
  20. 三层魔方拼接Get技巧

热门文章

  1. Spark分区器HashPartitioner和RangePartitioner代码详解
  2. http有哪些请求方法
  3. mysql的单个数据库物理迁移出现ERROR 1146 (42S02): Table 'xx' doesn't exist [问题点数:100分]...
  4. EasyUI datagrid 分页保持选中状态
  5. uoj22 外星人(dp)
  6. NumPy的思考……
  7. Node.js 常用Mongoose方法
  8. Tornado web 框架
  9. Codeforces Round #108 (Div. 2)
  10. SQL Server 2008 数据库同步的两种方式 (发布、订阅)