spring5.0.5初始化源码三部曲之一:AbstractApplicationContext构造方法

学习spring5.0.5初始化过程是深入了解spring过程中的重要一步,今天我们就以简单的一个demo为例来学习spring的初始化源码;

这个demo的源码可以在github上下载,地址和链接信息如下表所示:

名称链接备注
项目主页https://github.com/Lucas-lilong/blog-demo该项目在github上的主页
git仓库地址(https)https://github.com/Lucas-lilong/blog-demo.git该项目源码的仓库地址,https协议
git仓库地址(ssh)git@github.com:Lucas-lilong/blog-demo.git该项目源码的仓库地址,ssh协议

这个git项目中有多个文件夹,本章源码在springcoredemo文件夹中,如下图红框所示:

在这里插入图片描述
demo的关键代码如下:

public class DemoApplication {
    public static void main (String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        Simple bean = context.getBean(Simple.class);
        bean.execute();
        context.close();
    }
}

接下来我们从ClassPathXmlApplicationContext类的构造方法开始,学习spring初始化过程;

  1. 构造方法会调用另一个构造方法:
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh) throws BeansException {
        this(configLocations, refresh, null);
    }

如上parent为null,refresg为true;

  1. 接着看下一个被调用的构造方法:
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
            throws BeansException {
        super(parent);
        setConfigLocations(configLocations);
        if (refresh) {
            refresh();
        }
    }

如图所示,今天我们的分析重点集中在supper(parent)setConfigLocation(configLocations)refresh()这三个方法上,接下来开始逐一分析;

类图
看源码之前先打开类图,后面随时会用到:
在这里插入图片描述
好了准备完毕,本章我们分析supper(parent)方法;
supper(parent)

  1. ClassPathXmlApplicationContext类中调用supper(parent)实际上是调用AbstractApplicationContext的构造函数:
public AbstractApplicationContext(ApplicationContext parent) {
    this();
    setParent(parent);
}
  1. 先看this():
public AbstractApplicationContext() {
    this.resourcePatternResolver = getResourcePatternResolver();
}

上述代码将AbstractApplicationContext的resourcePatternResolver变量赋值,resourcePatternResolver的作用是根据路径得到类的resource对象;

  1. 展开getResourcePatternResolver()方法:
protected ResourcePatternResolver getResourcePatternResolver() {
		return new PathMatchingResourcePatternResolver(this);
	}

在创建PathMatchingResourcePatternResolver对象的时候,AbstractApplicationContext自身作为ResourceLoader传入到PathMatchingResourcePatternResolver;

  1. 将PathMatchingResourcePatternResolver的构造方法和几个常用的方法放在一起看:
public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) {
	Assert.notNull(resourceLoader, "ResourceLoader must not be null");
	this.resourceLoader = resourceLoader;
}
public ResourceLoader getResourceLoader() {
	return this.resourceLoader;
}
@Override
public Resource getResource(String location) {
	return getResourceLoader().getResource(location);
}

从上述的代码可见,在调用getResource(String location)方法的时候,实际上是执行的getResourceLoader().getResource(location),也就是执行的AbstractApplicationContext.getResource(location)方法;

  1. Resource的处理类已经确定,再回到AbstractApplicationContext构造方法,this()已经清楚,在看看setParent(parent):
@Override
	public void setParent(@Nullable ApplicationContext parent) {
		this.parent = parent;
		if (parent != null) {
			Environment parentEnvironment = parent.getEnvironment();
			if (parentEnvironment instanceof ConfigurableEnvironment) {
				getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
			}
		}
	}

由于ClassPathXmlApplicationContext的构造方法中parent参数为null,所以这段代码没必要细看了,记住this.parent为null即可;
初始化的第一部分已经完了,这部分的主要工作是为后续Resource处理准备好处理类,我自己来看的时候用了以下思维导图来帮助记住:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值