Spring框架学习[IoC容器载入Bean资源文件](五)

2014-11-24 03:05:57 · 作者: · 浏览: 9
ML资源进行特殊编码处理 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 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 {
  • //将资源文件转换为IO输入流 InputStream inputStream = encodedResource.getResource().getInputStream();
  • try { InputSource inputSource = new InputSource(inputStream);
  • if (encodedResource.getEncoding() != null) { inputSource.setEncoding(encodedResource.getEncoding());
  • } //具体读取过程的方法
  • return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); }
  • finally { 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 { int validationMode = getValidationModeForResource(resource);
  • //将XML文件转换为DOM对象,解析过程由documentLoader实现 Document doc = this.documentLoader.loadDocument(
  • inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware()); //这里是启动对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实现。

    9. DocumentLoader将Bean定义资源转换为Document对象:

    DocumentLoader将Bean定义资源转换成Document对象的源码如下:

    [java
    1. //使用标准的JAXP将载入的Bean定义资源转换成document对象 public Document loadDocument(InputSource inputSource, EntityResolver entityResolver,
    2. ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Exception { //创建文件解析器工厂
    3. DocumentBuilderFactory factory = createDocumentBuilderFactory(validationM