1.1、精尽 Spring 源码分析 —— 调试环境搭建(转译)

2023-11-02 15:50

本文主要是介绍1.1、精尽 Spring 源码分析 —— 调试环境搭建(转译),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 依赖工具

  • Gradle
  • Git
  • JDK1.8+
  • IntelliJ IDEA

笔者目前使用的系统版本是 macOS Mojave 10.14 。所以,如果胖友是 Windows 环境,胖到一些问题,请在星球给我留言。

懵逼的艿艿:根据现在收到的信息,貌似主要是 Windows 环境会搭建失败。如果胖友真的搭建不起来,建议可以先新建一个项目,搭建一个 Spring Demo 来调试。

? 总之,我们的目的是,一定一定一定要调试。酱紫,才能更好的阅读 Spring 的代码。

另外,本文参考官方提供的文档 《import-into-idea》 。

补充说明 1 :IntelliJ IDEA 请使用 2018 版本,之前有胖友反馈搭建不起来,因为 IDEA 版本过低。

2. 源码拉取

从官方仓库 https://github.com/spring-projects/spring-framework Fork 出属于自己的仓库。

  • 为什么要 Fork ?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。?
  • 本文使用的 Spring 版本为 5.1.1.BUILD-SNAPSHOT 。
  • 使用 IntelliJ IDEA 从 Fork 出来的仓库拉取代码。因为 Spring 项目比较大,从仓库中拉取代码的时间会比较长。

拉取完成后,Gradle 会开始自动 Build 项目。因为 Build 的过程中,会下载非常多的依赖,请耐心等待。

  • ? 不过笔者有点不太确定,Gradle 是否会自动 Build 项目,反正我的会。如果此处碰到问题,请给我留言。

3. 预编译 spring-oxm 项目

打开 IDEA Terminal ,输入如下命令,预编译 spring-oxm 项目:

./gradlew :spring-oxm:compileTestJava

当看到 BUILD SUCCESSFUL ,说明编译成功。

? 另外,笔者有点不确定,Gradle 在上面已经自动 Build 项目,这个步骤是否还需要。但是笔者不熟悉 Gradle 的机制,官方文档又要求这么做,所以做下也没什么影响。哈哈哈哈。

感谢【蝴蝶落于指尖】同学,经过测试,这个是必须的操作。

4. 运行示例

在 spring-context 项目中的 src/test/java/example 目录下,已经提供了一些示例。

① 解析 XML 配置文件成对应的 BeanDefinition 们的流程

可调试 org.springframework.beans.factory.xml.XmlBeanDefinitionReaderTests 的 #withFreshInputStream() 和 #withImport() 这两个单元测试。

相比来说,后者比前者多了一个 <import /> 标签的解析。当然,XmlBeanDefinitionReaderTests 类中,其它方法也可以简单调试下。看胖友的兴趣哈。

  • #factorySingleton() 方法,单例的 FactoryBean 的单元测试。

② 加载 Bean 的流程

可调试 org.springframework.beans.factory.xml.AbstractBeanFactoryTests 这个单元测试类里的方法。

实际上,AbstractBeanFactoryTests 是一个抽象类,所以在运行时,需要选择对应的子类,例如 XmlListableBeanFactoryTests 类。

③ ClassPathXmlApplicationContext 的流程

可调试 org.springframework.context.support.ClassPathXmlApplicationContextTests 这个单元测试类里的方法。例如 #testResourceAndInputStream() 方法。

④ 解析 Properties 配置文件成对应的 BeanDefinition 们的流程

选读,实际使用非常少。主要目的是为了更深入的理解 BeanDefinitionReader 的设计。

可调试 org.springframework.beans.factory.support.PropertiesBeanDefinitionReaderTests 这个单元测试里的方法。

另外,也推荐阅读下 《spring beans源码解读之 – BeanDefinition 解析器》 一文。

⑤ 调试 Spring AOP 相关的流程

参见 《精尽 Spring 源码分析 —— AOP 源码简单导读》

⑥ 调试 Spring Transaction 相关的流程

参见 《精尽 Spring 源码分析 —— Transaction 源码简单导读》

⑦ 调试 Spring MVC 相关的流程

参见 《精尽 Spring MVC 源码分析 —— 调试环境搭建》

⑧ TODO 芋艿,补充一些推荐阅读的示例

5. 可能碰到的问题

5.1 报 InstrumentationSavingAgent 不存在的错误

例如说,在运行 spring-context 项目中的单元测试时,会报 InstrumentationSavingAgent 存在的错误。此时,我们将 spring-context.gradle 修改如下:

`spring-context.gradle` 修改图

修改完成后,Gradle 又会自动 Build 项目,下载相关依赖。完成后,再次运行 spring-context 项目中的单元测试,顺利通过。

根据胖友【Tomy_Rich】测试的说法,凡是报 XXX 不存在的,就和 InstrumentationSavingAgent 的处理方式一样就可以了。

5.2 报 ‘io.spring.dependency-management’ 插件不存在

可参考 《Plugin [id: ‘io.spring.dependency-management’, version: ‘1.0.5.RELEASE’, apply: false] was not found in any of the following sources:》 一文进行解决。

来自胖友【贾鹤鸣】的提供。

5.3 其它

如果胖友你在搭建调试环境的过程中,如果碰到任何问题,可以在星球给我留言。

666. 彩蛋

笔者开始更新 Spring 源码解析系列,让我们在 2019 一起精尽 Spring 。

另外,笔者的好基友小明哥,已经在死磕 Spring 源码,并更新相应的文章。所以对于这个系列,如果小明哥已经写了,会直接进行引用。感谢小明哥的文章授权。美滋滋。

那么,就开始干吧。


重要的友情提示一:

《Spring 源码深度解析》,基于 Spring 3 版本的源码解析。虽然版本有点老,但是内容的流畅性很不错,特别是 Spring IoC 部分。艿艿自己也阅读了一遍,点赞。

  • Spring

这篇关于1.1、精尽 Spring 源码分析 —— 调试环境搭建(转译)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331661

相关文章

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage