写点什么

spring4.1.8 初始化源码学习三部曲之一:AbstractApplicationContext 构造方法

作者:程序员欣宸
  • 2022 年 6 月 07 日
  • 本文字数:1793 字

    阅读完需:约 6 分钟

spring4.1.8初始化源码学习三部曲之一:AbstractApplicationContext构造方法

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


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

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



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


  • demo 的关键代码如下:


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 初始化过程;

  • 构造方法会调用另一个构造方法:


public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh) throws BeansException {    this(configLocations, refresh, null);  }
复制代码


  • 如上,parent 参数为 null,refresh 为 true;

  • 接着看下一个被调用的构造方法:


public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)      throws BeansException {
super(parent); setConfigLocations(configLocations); if (refresh) { refresh(); } }
复制代码


  • 如上所示,今天我们的分析重点集中在 super、setConfigLocations、refresh 这三个方法上,接下来开始逐一深入;

类图

  • 看源码之前,先打开类图,后面随时会用到:


  • 好了,准备完毕,本章我们分析 super(parent)方法;

super(parent)

  • ClassPathXmlApplicationContext 类中调用的 super(parent)实际上是 AbstractApplicationContext 的构造方法:


public AbstractApplicationContext(ApplicationContext parent) {  this();  setParent(parent);}
复制代码


  • 先看 this():


public AbstractApplicationContext() {  this.resourcePatternResolver = getResourcePatternResolver();}
复制代码


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


  • 展开 getResourcePatternResolver 方法:


protected ResourcePatternResolver getResourcePatternResolver() {  return new PathMatchingResourcePatternResolver(this);}
复制代码


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

  • 将 PathMatchingResourcePatternResolver 的构造方法和常用的方法放到一起看看,如下:


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


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

  • Resource 的处理类已经确定,回到 AbstractApplicationContext 构造方法,this()我们已经清楚,再看下面的 setParent(parent):


@Overridepublic void setParent(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 处理准备好处理类,我自己在看的时候用了以下思维导图来助记:



  • 下一篇《spring4.1.8 初始化源码学习三部曲之二:setConfigLocations 方法》

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 2022 年 06 月 07 日阅读数: 18
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
spring4.1.8初始化源码学习三部曲之一:AbstractApplicationContext构造方法_Java_程序员欣宸_InfoQ写作社区