Spring 源码阅读:基于 XML 配置初始化 Spring 上下文过程总结(10+详细流程图)

Spring 源码解读:XML配置初始化上下文全程剖析
本文深入总结了基于 XML 配置初始化 Spring 上下文的过程,从整体结构到关键步骤,包括调用父类构造方法、设置配置文件路径和刷新上下文。详细阐述了 ClassPathXmlApplicationContext 的构造方法、XML 配置处理、BeanFactory 的创建和初始化,以及组件注册等环节,揭示了 Spring 框架在初始化背后的逻辑。

概述

最近一直在看 Spring 框架的源码,并且写了一系列文章记录学习的收获,目前主要分析了 Spring 上下文的初始化和 Bean 初始化的一部分源码。对 Spring 源码的阅读,可以让我更加了解一直在使用的 Spring 框架,也能让我从其中学到很多开发的技巧,比如设计模式的实践等。

随着对 Spring 源码的不断了解,对一些最开始学习到的东西,有了新的认识。因此,在继续学习之前,我打算把前面看过以及记录过的东西,做一个整体回顾。这样还有一个好处,就是之前的文章分析得相对细节,没有宏观的视角,也算是一个补充。

这篇总结一下基于 XML 配置初始化 Spring 上下文的过程,这篇文章会更多地关注流程的梳理,尽量减少代码细节的分析。

整体结构

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

上下文初始化的过程,都是从上下文类的构造方法被调用开始的。如果基于一个 XML 配置文件来初始化上下文,那么 ClassPathXmlApplicationContext 就是要用到的上下文类型。

在构造方法中,我们可以提供一个或多个 XML 配置文件的路径,上下文对象就是基于这些配置文件中的配置初始化的。

在这个构造方法中,调用了另外一个构造方法。

// 调用语句
this(new String[] {configLocation}, true, null);
// 方法定义
public ClassPathXmlApplicationContext(
      String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
      throws BeansException {
   super(parent);
   setConfigLocations(configLocations);
   if (refresh) {
      refresh();
   }
}

这个构造方法比之前多了两个参数。

  • refresh 参数传入的值是 true,因此,方法中的 refersh() 方法会被执行。
  • parent 指的是给当前初始化的上下文指定的一个父上下文,这里提供了一个空值,也就是当前创建的上下文没有父上下文。

这个构造方法中,分别调用了三个方法,下面介绍一个这三个方法分别做了什么。

调用父类的构造方法

首先调用父类的构造方法,执行父类构造方法的逻辑。以下是 ClassPathXmlApplicationContext 的部分继承关系:

父类的构造方法会逐级向上调用,在此过程中,主要是初始化了一些成员变量的值,其中包括上下文中包含的类加载器、资源加载器、资源模式解析器等,以及一些跟上下文配置相关的默认值。这些都是为之后的初始化做准备。

另外值得一提的是,如果在调用方法时,我们提供了 parent,也就是父上下文,在这部分还会对当前上下文和父上下文的 Environment (环境抽象)做合并。

至此,执行完这一步,上下文还是一个空架子。

设置配置文件路径

因为 ClassPathXmlApplicationContext 是一个基于 XML 配置的上下文对象,因此,在执行完父类的构造逻辑之后,就要开始处理 XML 配置了。

setConfigLocations 方法看起来像是一个普通的 Setter 方法,作用是把构造方法参数 configLocations 赋值给上下文中对应的成员变量。这个

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值