这块主要是把配置文件路径解析成 InputSource。

    首先进入,可以看出这是个包装方法,将资源整理成 EncodedResource,然后再调用重载的方法;

    1. @Override
    2. public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
    3. return loadBeanDefinitions(new EncodedResource(resource));
    4. }

    接下来进入,这里做了简单的校验,流转换,然后做进一步的调用;

    1. public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
    2. // 资源肯定不能空了
    3. Assert.notNull(encodedResource, "EncodedResource must not be null");
    4. if (logger.isTraceEnabled()) {
    5. logger.trace("Loading XML bean definitions from " + encodedResource);
    6. }
    7. // 存储加载的资源,用来检测是否循环导入
    8. Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();
    9. if (!currentResources.add(encodedResource)) {
    10. throw new BeanDefinitionStoreException(
    11. "Detected cyclic loading of " + encodedResource + " - check your import definitions!");
    12. }
    13. try (InputStream inputStream = encodedResource.getResource().getInputStream()) {
    14. // 转成SAX解析的输入流(Simple API for XML)
    15. InputSource inputSource = new InputSource(inputStream);
    16. if (encodedResource.getEncoding() != null) {
    17. inputSource.setEncoding(encodedResource.getEncoding());
    18. }
    19. // 接下来才进入正式的工作
    20. return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
    21. } catch (IOException ex) {
    22. throw new BeanDefinitionStoreException(
    23. "IOException parsing XML document from " + encodedResource.getResource(), ex);
    24. } finally {
    25. // 释放资源
    26. currentResources.remove(encodedResource);
    27. if (currentResources.isEmpty()) {
    28. this.resourcesCurrentlyBeingLoaded.remove();
    29. }
    30. }
    31. }