前面我们已经学习mybatis的源码,今天我们开始Spring源码的阅读之旅。阅读Spring的源码的第一步当然是编译Spring源码。首先我们要去GitHub上将spring源码给clone下来。
笔者编译环境如下:
idea的版本:idea2020.2
gradle版本:5.64
Spring版本:5.28
首先我们先进入Spring的官网,具体如下:
我们首先将Spring下载下来,具体的地址:Spring编译源码,然后将下载下来的压缩包进行解压
这个时候Spring的源码就准备好了,就要开始我们的编译之路了。那怎么编译呢?看下我们Spring的编译教程吧,具体如下:
按照上面的文档来说,我们需要一个JDK8以上的环境,笔者使用的是JDK8;然后通过 git clone
命令获取一份源码,这个事情笔者已经做完了;然后就是去项目的根目录下运行./gradlew build
。
这个时候我们不要着急去运行这个文件;这个命令一运行会下载一份gradle到我们本地,然后通过下载好的gradle去编译Spring源码;为什么运行这个命令会自动下载gradle呢?从那下载呢?版本是什么呢?
gradlew就是我们需要运行的命令;但是现在先不要着急运行;因为这个命令会去读取一个文件;这个文件当中配置gradle的版本和下载地址;一旦运行就是自动下载,有时候需要翻墙去下载,很多时候都会下载失败,就算下载过来了目录也是他自动指定的,下载过来后解压的目录等等都是在那个文件中配置了;索性我们将这个配置文件给修改了。
这个配置文件的路径–spring-framework\gradle\wrapper\gradle-wrapper.properties
我们要修改是gradle的下载地址,修改成本地。这个时候我们打开对应的文件如下:
具体的配置的项的意思如下:
distributionBase=下载后的目录,自己配置好。GRADLE_USER_HOME 如果是windows系统默认问c:\Users\你的用户.gradle
distributionPath=会自动拼接好distributionBase
zipStoreBase=解压的目录
现在我们需要自己手动的配置好gradle,由于指定的gradle版本是5.64,所以我们下载一个gradle为5.64的版本,对应的下载地址,如果下载不下来,可以去笔者的资源中下载,然后就是配置GRADLE_USER_HOME这个变量的位置了,Windows中配置就是配置环境变量,由于笔者是使用Mac,所以这儿只讲Mac的配置流程。
首先我们下在gradle放在指定的目录下:
然后配置环境变量
GRADLE_USER_HOME=/Users/king/JavaLibrary/gradle-5.64
export GRADLE_USER_HOME
然后更新一下配置
source .bash_profile
这个时候我们需要修改原来的gradle-wrapper.properties,修改的内容如下:
distributionUrl=file\:/Users/king/JavaLibrary/gradle-5.64/gradle-5.6.4-bin.zip
#distributionUrl=file\:///d\:/Users/king/JavaLibrary/gradle-6.6.1-bin.zip
下面的配置是对于Windows的配置的。这个时候我们还需要gradle的下载仓库,具体的操作如下:
maven {url 'https://maven.aliyun.com/nexus/content/groups/public/'} //阿里云
maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
这个时候执行编译的命令,具体如下
./gradlew build
#Windows下执行gradlew.bat
刚开始编译是报错,但是没有关系,我们再编译一次
可以看到我们第二次就编译成功了。下面的错误我们不用管。后面我们就开始导入idea中去(刚才编译的网站有说明),这个时候我们执行下面的命令
./gradlew :spring-oxm:compileTestJava
#Windows下的命令gradlew :spring-oxm:compileTestJava
具体的运行的结果如下:
首先我们要对idea进行一些设置,具体如下:
然后选择已存在的源进行导入。
然后选中原来的项目。具体如下:
记住上面要选build.graadle文件,然后等待idea建立好缓存
这个时候我们需要修改如下的设置,具体如下:
然后我们需要修改运行的配置为idea运行,不然每次idea运行都会通过gradle去编译运行——gradle运行编译特别慢;需要改成idea自己编译运行。具体如下:
再次说明一下这里不是一定要改,但是如果你不改用默认的则会特别慢,改成idea快的不止一点点。
改完之后便可以建一个子model来测试了,但是一定得建gradle的项目,因为spring源码这个父项目就是用gradle来开发的
然后创建好添加以下的依赖。
compile(project(":spring-context"))
然后开始开始完善项目的其他
配置类的代码
package com.ys;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.ys")
public class AppConfig {
}
service的代码
package com.ys;
import org.springframework.stereotype.Component;
@Component
public class IndexService {
}
测试类的代码
package com.ys;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(ac.getBean(IndexService.class));
}
}
然后点击运行。
可以看到我们Spring的源码就编译成功,同时测试也成功了。