前言

Spring源码是我一直在追求的东西,也是一直在学习,近两年公司的事情实在是太多了,所以并没有真正的继续系统的学习,以前在学习的过程中积累了很多多笔记,也是整理出来做一个分享吧!后续会陆续的公开到博客当中

1、下载源码

这里我推荐使用码云下载源码速度稍微快一些,如果你可以科学上网访问github的话那其实都一样。
码云地址:https://gitee.com/mirrors/spring-framework
github地址:https://github.com/spring-projects/spring-framework

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.1emkq1cm2r0.jpg

2、编译前的优化

首先切换一下分支 我这里选择spring5.2的版本去编译的

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.6ayybrsdngs0.jpg

找到这个文件,将从远程下载gradle的地址修改为本地自己已经下载gradle的本地路径,(因为Spring源码是使用Gradle来编译的并不是我们原来熟悉的maven,所以想要学习Spring源码的话是需要掌握Gradle的,关于Gradle本文就不做多的解释请自行查阅先关资料。)

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.3oblu8frw580.jpg

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.4apmsda5cjc0.jpg

打开spring源码中build.gradle文件配置阿里镜像

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.2i0yj95yerm0.jpg

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.1ak9n2z11an4.jpg

1
2
3
4
maven { url "https://repo.spring.io/libs-spring-framework-build" }
maven { url "https://repo.spring.io/snapshot" } // Reactor
maven {url 'https://maven.aliyun.com/nexus/content/groups/public/'} //阿里云
maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}

至此编译spring源码前的准备工作就算完成了

为什么要做前面这几步?

首先得了解gradlew.bat做了什么,运行这个命令spring首先会下载一个gradle到本地来,然后通过gradle去编译spring源码。一旦运行了之后下载到哪里也是自动指定的而且会很慢,因为是国外的网站,然后可能一些jar包也下载不下来,所以我们进行一系列的操作都是为了去更快更不容易出错得去编译spring源码。

3、编译源码

cmd执行命令

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.1s09riha94o0.jpg

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.yjbkrtwtnds.jpg

这样就编译成功了 之后就可以导入idea里了

导入idea的文档请查阅 https://github.com/spring-projects/spring-framework/blob/master/import-into-idea.md 

根据文档的提示导入idea之前需要去 Precompile spring-oxm 也就是预编译oxm这个项目;运行

1
gradlew :spring-oxm:compileTestJava

这里运行时间会很长

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.3ns3zkzu2j00.jpg

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.33o3s1bmfqe0.jpg

4、导入idea

导入idea之前需要先进行一下idea的一些环境设置,比如gradle、jdk等等的设置(如果已经全局设置过就不需要了)

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.40cujde1p0y0.jpg

这里一定要设置一下因为如果不设置的话导入idea时又会重新下载一遍jar包

我的是在这个路径下

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.3o34ztw4l3o0.jpg

导入spring源码到idea

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.1m4o70rppj8g.jpg

选择项目目录当中的build.gradle文件导入

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.3530e2j91tm0.jpg

导入后idea会开始建立索引这个过程也会很漫长

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.2nvrqvdsqqg0.jpg

这里看一下刚才的设置有没有存在

我这里看设置并没有生效所以需要在设置一下

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.4es1rgz5i8m0.jpg

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.l2vmruvbdb4.jpg

验证

接下来验证源码能不能用,创建一个模块来引用spring源码然后进行一个简单的测试

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.pzfac58g0mo.jpg

这里选择gradle,因为spring源码就是使用的gradle所以我们也必须使用gradle不能使用maven

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.511ckcv47fw0.jpg

我的模块已经建立好了

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.4w7k5ustpns0.jpg

引入spring-context依赖

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.6n0hnqjt0fs0.jpg

这里只是简单的建立了一个配置类 什么都没有 只是加了两个注解 一个是配置类的注解、一个是扫描包路径的注解

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.51miod88vro0.jpg

建立了一个普通的类 加了component注解,

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.1urtgkd202zk.jpg

运行spring源码然后调用api获取bean

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.4scby8h5qi20.jpg

这个时候跑一下 可能会有报错,比如找不到类之类的错误

哪里报错就到哪个模块下面的test下run一下

比如这个错误在spring-context下面

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.1h0cibhpxh5s.jpg

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.60tnh32rlk00.jpg

在test上右键选择run all tests

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.6q9yhow1m1g0.jpg

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.5qad9vdcjpc0.jpg

解决完这些错误之后再运行就可以了

https://cdn.jsdelivr.net/gh/Yc100/picx-images-hosting@master/file1/clipboard.679c5vul16g0.jpg

结尾

至此Spring源码从下载到编译然后引入Idea的过程就结束了。可能在实操中会遇到各种各样的问题,这都属于正常,因为环境不一样或者版本不一样。希望看到此文章的小伙伴遇到错误千万不要着急也希望千万不要放弃。因为这个解决错误的过程其实就是最好的学习Spring源码的过程。相信只要努力一定可以成功。有问题也可以联系我,我们互相讨论学习!