⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 https://www.iocoder.cn/Spring/build-debugging-environment-5-3-1/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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

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

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

视频可见 B 站:https://www.bilibili.com/video/BV1yh411q7jb/

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

1. 依赖工具

1.1 IDEA

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

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

友情提示:如果不知道怎么激活 IDEA 的胖友,可以访问 《IDEA 激活指南》 地址,花 5 分钟学习!支持所有版本~

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 从官方仓库 https://github.com/spring-projects/spring-framework 克隆项目。

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

即使使用 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 调试小技巧

5. 源码解析

艿艿在知识星球更新了 Spring 源码解析系列,感兴趣的胖友可以看看哟。目录如下:

文章目录
  1. 1. 1. 依赖工具
    1. 1.1. 1.1 IDEA
    2. 1.2. 1.2 JDK
  2. 2. 2. 源码拉取
  3. 3. 3. 下载依赖
  4. 4. 4. 调试 Spring 示例
  5. 5. 5. 源码解析