Spring源码学习01:IntelliJ IDEA2019.3编译Spring5.3.x源码
目录
Spring源码学习01:IntelliJ IDEA2019.3编译Spring5.3.x源码
前言
工欲善其事必先利其器。学习和深读Spring源码一个重要的前提:编译源码到我们的本地环境。这样方便我们在本地环境添加注释、断点追踪、查看类或接口的继承关系等等,更加高效的学习Spring源码。个人觉得深读Spring源码对我们的编码水平会有很大很大的提升,因为其牵涉的广度、深读、以及优秀编码规范都值得我们去品、细品、慢慢品。废话不多说,本篇就如何在我们的intelliJ IDEA编译Spring源码的步骤以及在编译的过程中遇到的问题做一个详细说明。
环境
- 开发工具: IntelliJ IDEA 20193.3
- 编译工具: gradle-6.4-rc-4
- 操作系统: windows 10
编译
一、下载Spring源码
访问Spring官方源码地址 https://github.com/spring-projects/spring-framework.git
,下载源码zip包到本地
二、下载和配置编译工具Gradle
1. 下载Gradle
访问Gradle官网 https://services.gradle.org/distributions/
,选择gradle-6.4-rc-4-bin.zip(截止2020-05-03当前最新),下载到本地并解压
2. 配置Gradle系统环境变量
3. 验证Gradle
三、IntelliJ IDEA编译Spring源码
1. 导入Spring源码至IntelliJ IDEA
将之前下载好的Spring源码解压后导入到IDEA,依次点击File->New->Project from Existing Sources,选择源码包路径下的 build.gradle
文件完成源码导入
2. IntelliJ IDEA配置Gradle
依次打开File->Settings
3. 开始编译

按照上面描述,因为上面导入我是按照第二步去做的。最后仅仅只需做第1条,预编译spring-oxm。进入项目路径,执行以下命令完成spring-oxm的预编译即可
gradlew :spring-oxm:compileTestJava
完成了spring-oxm的预编译之后,就可以编译我们的代码了,一般由IDEA自动帮我们完成源码到projects的转换,也可以由我们手动import。
自此,编译的整个过程已经完成。下面我们要做的事就是添加自己的模块对已编译的项目模块进行验证测试,相信我验证会是一个有趣的过程。
测试
打开源码我们可以看到每个模块都对应的有单元测试,再相比较平时自己在开发时干的事情。再想到流行的敏捷开发模式中的TDD(测试驱动开发),没有测试就没有功能代码。不禁觉得其中的优秀是为了让我忘尘而叹。
扯回正题,不能让你们觉得我扯废话凑字数暴露没啥水平的真实情况。上面说到各个模块的单元测试我们可以测试编译项目是否有问题,但是后续学习在于模块之间的整合之上。所以我在此添加一个新的模块,这个模块模拟一个bean的创建和获取这么个过程。
1. 创建模块spring-fly4j
如果你们想问这名字有啥深意吗?抱歉哈..没有。想起spring-test起不了,你们懂spring有这个模块了,起名障碍啊,强行理解的话:“为了java飞吧”,忍住别笑


2. 添加测试模块代码

我这里贴出这5个文件的代码
@Configuration @ComponentScan("com.fly4j.spring.context.**") public class ContextConfig { }
public interface IUserService { }
@Service @Scope("singleton") public class UserServiceImpl implements IUserService { public UserServiceImpl() { System.out.println(this.getClass().getSimpleName() + " 构造函数执行..."); } }
public class ContextApplication { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( ContextConfig.class ); IUserService bean = context.getBean(IUserService.class); System.out.println(bean); } }
// build.gradle dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compile(project(":spring-context")) compile(project(":spring-instrument")) }
相信以上代码机智的你一看就明白其意,其中build.gradle就只添加了spring-context和spring-instrument的依赖,spring-context模块里包含了bean工厂,可想而知,我这里生成bean和取出bean的测试案例是多么的依赖这个模块,另一个spring-instrument是spring-context模块编译需要的。
3. 测试
运行ContextApplication的main方法,其中会提示找不到CoroutinesUtils符号,这个问题解决我在下面一节的“问题一”进行了说明,我这里先放结果好了。
如上可以看到从上下文注入bean和取出bean的过程,至此spring-context这个重要模块验证成功结束。
问题
1. 问题一
Error:(350, 51) java: 找不到符号 符号: 变量 CoroutinesUtils 位置: 类 org.springframework.core.ReactiveAdapterRegistry.CoroutinesRegistrar
解决:依次File->Project Structure->Libraries->+->java->spring-core->kotlin-coroutines->build->libs->kotlin-coroutines-5.3.0-SNAPSHOT.jar
2. 问题二
Error:(26, 38) java: 找不到符号 符号: 类 InstrumentationSavingAgent 位置: 程序包 org.springframework.instrument
解决:因为spring-context对spring-instrument有依赖,在build.gradle添加对spring-instrument的依赖即可。
结语
https://github.com/haoxianrui/spring-framework.git