10 分搭建一个 Spring 源码的调试环境,保姆级教程!

2,200 阅读3分钟

大家好,我是艿艿,一个在某厂搬砖做 Web IDE 的小胖子!

今儿,我们来搭建一个 Spring 调试环境,目标是:启动 Spring 容器,解析 XML 配置,创建 Bean 对象

为什么是 XML 配置,而不是注解呢?

使用 XML 配置来声明 Bean 的逻辑比较清晰,理解起来相对容易一些。

视频可见 B 站:www.bilibili.com/video/BV1yh…

😝 艿艿比较腼腆,大家给个三连支持一下,感恩 1024~

1. 依赖工具

1.1 IDEA

当然是 Jetbrains 出品的 IDEA 工具,相信绝大多数胖友都使用的它。

艿艿使用的是 2020.3 版本,胖友尽量保证不低于该版本哈。

1.2 JDK

需要使用 JDK 编译 Spring 的代码,这里艿艿使用的是 JDK 1.8 版本

$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

2. 源码拉取

使用 IDEA 从官方仓库 github.com/spring-proj… 克隆项目。

友情提示:如果网络不是很好的胖友,可以选择和艿艿一样,使用 Gitee 提供的镜像仓库 gitee.com/mirrors/Spr…

即使使用 Gitee 的镜像,克隆也要好几分钟,代码有 100M 左右!!!

这里,我们使用的 Spring 版本是 5.3.10-SNAPSHOT

友情提示:胖友可以考虑 Fork 下官方仓库,为什么呢?

既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。😜

3. 下载依赖

① 克隆完成 Spring 项目之后,IDEA 会自动下载需要的 Gradle 工具。如下图所示:

下载 Gradle 工具

这里,我们使用的 Gradle 版本是 6.8.3

友情提示:由于是从国外的网址下载,所以需要耐心等待一会,艿艿花费了 2 分多钟。

② 下载完 Gradle 工具之后,IDEA 就会使用它自动下载相关的依赖库。如下图所示:

下载依赖

因为 Gradle 支持使用 Maven 依赖,所以我们可以使用阿里云的 Maven 镜像 https://maven.aliyun.com/nexus/content/groups/public/**。修改 build.gradle 文件,如下图所示:

下载依赖

效果非常不错,不过艿艿还是花了 10 分钟才下载完了依赖。主要原因是,Spring 对很多框架进行集成,导致引入了非常多的依赖。

ps:如果中间下载失败,点击【绿色刷新】按钮,继续下载依赖即可。

4. 调试 Spring 示例

依赖下载完,我们就可以调试 Spring 的源码。虽然说 Spring 并没有直接提供 example 使用示例项目,但是我们通过调试 Spring 提供的单元测试类,了解 Spring 的执行流程。

例如说:

① 通过 Debug 运行 XmlBeanDefinitionReaderTests 类的 #withFreshInputStream() 的方法,调试 Spring 解析 XML 配合,获得 Bean 的定义。如下图所示:

调试 XmlBeanDefinitionReaderTests 类

后续,胖友可以通过调试 XmlBeanDefinitionReader 类的源码,了解更多。

友情提示:Spring 是先解析到 Bean 的定义,然后创建 Bean 对象。🙂

② 通过 Debug 运行 ClassPathXmlApplicationContextTests 类的 #testSingleConfigLocation() 的方法,调试 Spring 容器的初始化过程,包括 Bean 的创建。如下图所示:

调试 ClassPathXmlApplicationContextTests 类

后续,胖友可以通过调试 ClassPathXmlApplicationContext 类的源码,了解更多。


再额外分享一个小技巧,如果在阅读 Spring 源码的时候,发现一个逻辑的分支走不到,我们在该处打上断点,然后执行整个目录的单元测试。如下图所示:

Spring 调试小技巧

更多 Spring 相关的文章,可以看看 《Spring Framework 实现原理与源码解析》 哟。

更多 Spring Boot 相关的文章,可以看看 《Spring Boot 实现原理与源码解析》 哟。

更多 Spring Cloud 相关的文章,可以看看 《Spring Cloud 实现原理与源码解析》 哟。