Spring----SpringMVC源码解析(一)

最近慢慢的系统的回顾一些技术:

储备:

1 IOC容器启动的基本过程

两个过程:

                 (1) 一个是在web容器建立双亲IOC容器

                 (2)生成相应的WebApplicationContext并将其初始化

2 Web容器中的上下文设计

    

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.web.context.support;

import java.io.IOException;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.ResourceEntityResolver;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;

public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
    //这里是设置默认BeanDefinition得地方,在/WEB-INF/applicationContext.xml文件中
    //默认读取文件得位置
    public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";
    //默认配置文件得位置在/WEB-INF/目录下
    public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";
    //默认得配置文件后缀名.xml
    public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";

    public XmlWebApplicationContext() {
    }
    //又看到了熟悉得loadBeanDefinition,就像前面对IOC容器得分析一样,这个加载过程在容器refresh()时启动

    protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
        //对beanDefinition信息进行解析
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
        //这里设置ResourceLoader,因为xmlWebApplicationContext是DefaultResource的子类,所以这里同样会使用DefaultResourceLoader来定位BeanDefinition
        beanDefinitionReader.setEnvironment(this.getEnvironment());
        beanDefinitionReader.setResourceLoader(this);


        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
//允许子类为reader配置自定义的初始化过程
        this.initBeanDefinitionReader(beanDefinitionReader);
//这里使用定义好的XmlBeanDefinitionReader来载入BeanDefinition
        this.loadBeanDefinitions(beanDefinitionReader);
    }

    protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) {
    }
//如果有多个BeanDefinition的文件定义,需要逐个载入,都是通过reader来完成的
//这个初始化过程是由refreshBeanFactory方法来完成的,这里只是负责载入BeanDefinition
    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
        String[] configLocations = this.getConfigLocations();
        if (configLocations != null) {
            String[] var3 = configLocations;
            int var4 = configLocations.length;

            for(int var5 = 0; var5 < var4; ++var5) {
                String configLocation = var3[var5];
                reader.loadBeanDefinitions(configLocation);
            }
        }

    }
//获取默认位置/WEB-INF/applicationContext.xml
    protected String[] getDefaultConfigLocations() {
        return this.getNamespace() != null ? new String[]{"/WEB-INF/" + this.getNamespace() + ".xml"} : new String[]{"/WEB-INF/applicationContext.xml"};
    }
}

代码中看到,基本的上下文功能都已经通过类的继承获得,这里需要处理的是,如何获取Bean定义信息,在这里,就转化如何在web容器环境如这里指定的/WEB-INF/applicationContext.xml中获取Bean的信息.然后通过XmlBeanDefinitionReader来载入Bean定义信息的,最终完成整个上下文的初始化.

参考:<<spring技术内幕:深入理解spring架构与设计原理>>

猜你喜欢

转载自blog.csdn.net/weixin_40403930/article/details/89474593