这块主要是把配置文件路径解析成 InputSource。
首先进入,可以看出这是个包装方法,将资源整理成 EncodedResource,然后再调用重载的方法;
@Overridepublic int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {return loadBeanDefinitions(new EncodedResource(resource));}
接下来进入,这里做了简单的校验,流转换,然后做进一步的调用;
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {// 资源肯定不能空了Assert.notNull(encodedResource, "EncodedResource must not be null");if (logger.isTraceEnabled()) {logger.trace("Loading XML bean definitions from " + encodedResource);}// 存储加载的资源,用来检测是否循环导入Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();if (!currentResources.add(encodedResource)) {throw new BeanDefinitionStoreException("Detected cyclic loading of " + encodedResource + " - check your import definitions!");}try (InputStream inputStream = encodedResource.getResource().getInputStream()) {// 转成SAX解析的输入流(Simple API for XML)InputSource inputSource = new InputSource(inputStream);if (encodedResource.getEncoding() != null) {inputSource.setEncoding(encodedResource.getEncoding());}// 接下来才进入正式的工作return doLoadBeanDefinitions(inputSource, encodedResource.getResource());} catch (IOException ex) {throw new BeanDefinitionStoreException("IOException parsing XML document from " + encodedResource.getResource(), ex);} finally {// 释放资源currentResources.remove(encodedResource);if (currentResources.isEmpty()) {this.resourcesCurrentlyBeingLoaded.remove();}}}
