美文网首页Java成长之路
Spring加载流程源码分析01「super」

Spring加载流程源码分析01「super」

作者: 路人甲java | 来源:发表于2021-01-09 09:37 被阅读0次

前面给大家介绍了Spring中的IOC和AOP。本文开始带大家解读下Spring容器加载的过程。我们使用的Spring的版本是4.3.3.RELEASE


IOC类图

在这里插入图片描述

Spring源码分析

初学Spring我们第一个入口代码如下,我们就从这个入口开始探究

public static void main(String[] args) {
    ApplicationContext ac = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
    User bean = ac.getBean("user",User.class);
    System.out.println(bean);
}

从ClassPathXmlApplicationContext的构造方法开始查看


在这里插入图片描述 在这里插入图片描述

this中的参数

参数
configLocation applicationContext.xml
parent null
refresh true
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
        throws BeansException {
    // 1.初始化父类
    super(parent);
    // 2.设置本地的配置信息
    setConfigLocations(configLocations);
    // 3.完成Spring容器的初始化
    if (refresh) {
        refresh();
    }
}

上面的supersetConfigLocationrefresh分别就是我们需要重点介绍的。
Spring的类图,记录在此

在这里插入图片描述

super(parent)

super(parent)其实就是调用的AbstractXmlApplicationContext的构造方法

public AbstractXmlApplicationContext(ApplicationContext parent) {
    super(parent);
}

在往上是AbstractRefreshableConfigApplicationContext的构造方法

public AbstractRefreshableConfigApplicationContext(ApplicationContext parent) {
    super(parent);
}

在往上是AbstractRefreshableApplicationContext的构造方法

public AbstractRefreshableApplicationContext(ApplicationContext parent) {
    super(parent);
}

在往上是AbstractApplicationContext构造方法,在此构造方法中就没有再显示的super(parent)了。

public AbstractApplicationContext(ApplicationContext parent) {
    this();
    setParent(parent);
}

this()

先来看下this方法。

public AbstractApplicationContext() {
    this.resourcePatternResolver = getResourcePatternResolver();
}

在该构造方法对resourcePatternResolver 变量赋值。resourcePatternResolver 的作用是根据路径得到类的Resource对象;
查看getResourcePatternResolver方法:

protected ResourcePatternResolver getResourcePatternResolver() {
    return new PathMatchingResourcePatternResolver(this);
}

创建PathMatchingResourcePatternResolver对象的时候,AbstractApplicationContext将自身作为ResourceLoader传递给了PathMatchingResourcePatternResolver;

public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) {
    Assert.notNull(resourceLoader, "ResourceLoader must not be null");
    this.resourceLoader = resourceLoader;
}
@Override
public Resource getResource(String location) {
    return getResourceLoader().getResource(location);
}

setParent(parent)

@Override
public void setParent(ApplicationContext parent) {
    this.parent = parent; // null
    if (parent != null) {
        Environment parentEnvironment = parent.getEnvironment();
        if (parentEnvironment instanceof ConfigurableEnvironment) {
            getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
        }
    }
}

因为parent为null所以if语句中的代码不会执行,所以此if中的代码在此逻辑中不会执行,所以在此就没有分析的必要了。
初始化的第一部分就分析完毕了,这部分的主要工作是为后续Resource处理准备好处理类

相关文章

网友评论

    本文标题:Spring加载流程源码分析01「super」

    本文链接:https://www.haomeiwen.com/subject/nqxcaktx.html