Spring源码学习系列(一)之初探xml解析

2019-06-27  本文已影响0人  just_like_you

1、从简单的xml解析bean开始

BeanFactory factory = new BeanFactory(new ClassPathResource("beans.xml"));
YourBean bean = factory.getBean(YourBean.class);

1.1、上面一共做了两个比较重要的动作

1.2、怎么加载*.xml配置文件?

ClassPathResourceResource的一个实现类,而Resource是Spring的一个对java底层URL的增强抽象,里面包括是否可读,还有转化为URL,File等方法。在ClassPathResource中是通过类加载来加载类路径下的资源,而FileSystemResource是直接通过FileIntputStream来获取文件资源。

Resource抽象方法

1.3、BeanFactory的构造、初始化过程

1-1
    @Override
    public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
        return loadBeanDefinitions(new EncodedResource(resource));
    }
    public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
  .....校验
              // 将资源绑定到当前线程
        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 inputStream = encodedResource.getResource().getInputStream();
            try {
  //这里会将Resource的输入流拿到然后转化为xml中的IntputSource
                InputSource inputSource = new InputSource(inputStream);
                if (encodedResource.getEncoding() != null) {
                    inputSource.setEncoding(encodedResource.getEncoding());
                }
    //执行加载的主要逻辑
                return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
            }
    .....关闭资源
    }
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
            throws BeanDefinitionStoreException {

        try {
                  //  SAX解析为xml的Document对象
            Document doc = doLoadDocument(inputSource, resource);
                  // 注册BeanDefinition并返回数量
            int count = registerBeanDefinitions(doc, resource);
            if (logger.isDebugEnabled()) {
                logger.debug("Loaded " + count + " bean definitions from " + resource);
            }
            return count;
        }
        
    protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception {
        return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler,
                getValidationModeForResource(resource), isNamespaceAware());
    }

完结,下一章注册BeanDefinition

上一篇 下一篇

猜你喜欢

热点阅读