Spring源码--obtainFreshBeanFactory方法

1.位于AbstractApplicationContext类的obtainFreshBeanFactory()方法

   protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
        refreshBeanFactory();
        ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        return beanFactory;
    }

2. AbstractRefreshAbleApplicationContext类的refreshBeanFactory()方法
  

 protected final void refreshBeanFactory() throws BeansException {
            DefaultListableBeanFactory beanFactory = createBeanFactory();
            beanFactory.setSerializationId(getId());

           //设置存在多个重名bean时是否覆盖;设置是否允许循环引用
            customizeBeanFactory(beanFactory);

            //加载BeanDefinitions
            loadBeanDefinitions(beanFactory);
            synchronized (this.beanFactoryMonitor) {
                this.beanFactory = beanFactory;
            }
    }

3. AbstractXmlApplicationContext类的loadBeanDefinitions()方法

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
        beanDefinitionReader.setEnvironment(this.getEnvironment());
        beanDefinitionReader.setResourceLoader(this);
        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
        initBeanDefinitionReader(beanDefinitionReader);
        loadBeanDefinitions(beanDefinitionReader);
    }

protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {

       //加载Resource类型的XML文件
        Resource[] configResources = getConfigResources();
        if (configResources != null) {
            reader.loadBeanDefinitions(configResources);
        }

       //加载String类型的XML文件(经过一些列转换最终会按照Resource类型的文件加载)
        String[] configLocations = getConfigLocations();
        if (configLocations != null) {
            reader.loadBeanDefinitions(configLocations);
        }
   }

4. AbstractBeanDefinitionReader中的loadBeanDefinitions方法

    public int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException {
        int counter = 0;
        for (Resource resource : resources) {
            counter += loadBeanDefinitions(resource);
        }
        return counter;
    }

5. XmlBeanDefinitionReader中的loadBeanDefinitions方法
  

 public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {

        //很重要的设置编码格式的类EncodedResource
        return loadBeanDefinitions(new EncodedResource(resource));
    }

  public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
            InputStream inputStream = encodedResource.getResource().getInputStream();
            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 {

            //加载XML文件的DOM结构内容
            Document doc = doLoadDocument(inputSource, resource);

           //将DOM结构内容转化为BeanDefinition对象注册到容器中
            return registerBeanDefinitions(doc, resource);
   }

  public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
        BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
        documentReader.setEnvironment(this.getEnvironment());
        int countBefore = getRegistry().getBeanDefinitionCount();
        documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
        return getRegistry().getBeanDefinitionCount() - countBefore;
    }

6. DefaultBeanDefinitionDocumentReader类的registerBeanDefinitions()方法 

public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
        this.readerContext = readerContext;
        logger.debug("Loading bean definitions");
        Element root = doc.getDocumentElement();
        doRegisterBeanDefinitions(root);
    }

protected void doRegisterBeanDefinitions(Element root) {

        //解析XML前置方法

        preProcessXml(root);

       //转换XML节点为BeanDefinition
        parseBeanDefinitions(root, this.delegate);

       //解析XML前置方法
        postProcessXml(root);
    }

parseBeanDefinitions()方法后续的内容就不写了,感兴趣的自己翻翻源码吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值