目录

Spring源码阅读环境搭建

阅读 Spring 源码前的准备工作,一步一步搭建 Spring 源码阅读环境

准备工作

首先安装 Gradle并配置好环境变量。 https://imgs.lambdahru.com/images/20210801194326.png#crop=0&crop=0&crop=1&crop=1&id=wWOJt&originHeight=346&originWidth=670&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

.gradle 文件夹下,一般位于用户目录下。(可以自定义修改,在环境变量中配置 GRADLE_USER_HOME 即可) https://imgs.lambdahru.com/images/20210801194822.png#crop=0&crop=0&crop=1&crop=1&id=Pgeq7&originHeight=190&originWidth=667&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

Linux 用户

1
2
3
4
vim ~/.bashrc

# 添加
export PATH=<your GRADLE_USER_HOME>:$PATH

创建 init.gradle配置文件,指定国内镜像源。当然也可以在 setting.gradle中指定 https://imgs.lambdahru.com/images/20210801194549.png#crop=0&crop=0&crop=1&crop=1&id=DC841&originHeight=337&originWidth=724&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
allprojects {
    repositories {
        def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
        all { ArtifactRepository repo ->
            if (repo instanceof MavenArtifactRepository && repo.url != null) {
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                    remove repo
                }
            }
        }
        maven {
            url REPOSITORY_URL
        }
    }
}

以上工作如果已经都配置请忽略,直接开始下面的步骤。 从GitHub克隆源码,我使用的 v5.3.9版本。也可以下载源码压缩包,但是必须进行一次 commit 否则会报错

1
git clone --branch=v5.3.9 --depth=1 git@github.com:spring-projects/spring-framework.git

预编译

根据 import-into-idea.md 的提示,我们需要进行预编译

  1. Precompile spring-oxm with ./gradlew :spring-oxm:compileTestJava
  2. Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
  3. When prompted exclude the spring-aspects module (or after the import via File-> Project Structure -> Modules)
  4. Code away

在工程目录下运行 gradlew :spring-oxm:compileTestJava 等待差不多 3 分钟。如果无法科学网上,则会出现网络错误 https://imgs.lambdahru.com/images/20210801201556.png#crop=0&crop=0&crop=1&crop=1&id=rQD9y&originHeight=703&originWidth=1110&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

这个时候只需要将其版本6.8.3 提前下载好,然后复制到 GRADLE_USER_HOME/wrapper/dists/<gradle_version>/<hash>/  下就可以 https://imgs.lambdahru.com/images/20210801201910.png#crop=0&crop=0&crop=1&crop=1&id=ApBoN&originHeight=200&originWidth=660&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

再次执行 gradlew :spring-oxm:compileTestJava就可以了 https://imgs.lambdahru.com/images/20210801200544.png#crop=0&crop=0&crop=1&crop=1&id=sxJe3&originHeight=700&originWidth=1114&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

导入到IDEA

然后使用IDEA打开spring-framework目录等待 building。这个过程会比较久一点 https://imgs.lambdahru.com/images/20210801200800.png#crop=0&crop=0&crop=1&crop=1&id=dKyIi&originHeight=871&originWidth=1426&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

创建测试模块

等待 Build 完后创建一个新的模块,取名为 spring-demo 或者其他的名字 https://imgs.lambdahru.com/images/20210801203443.png#crop=0&crop=0&crop=1&crop=1&id=Xi6N6&originHeight=851&originWidth=765&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

创建好后我们在build.gradle中添加两个依赖以及配置阿里源 https://imgs.lambdahru.com/images/20210801204027.png#crop=0&crop=0&crop=1&crop=1&id=H4xge&originHeight=549&originWidth=654&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

创建启动类以及测试类

并且创建一个 AppConfig ,A , BMain 类。用于测试

1
2
3
4
5
public class Main {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
	}
}
1
2
3
4
@Configurable
@ComponentScan("org.spring.demo.**")
public class AppConfig {
}
1
2
3
4
5
6
7
8
9
@Component
public class A {
	@Autowired
	B b;

	public A() {
		System.out.println("bean A create");
	}
}
1
2
3
4
5
6
7
8
9
@Component
public class B {
	@Autowired
	A a;

	public B() {
		System.out.println("bean B create");
	}
}

然后运行 main方法,可以看到已经能够打印出 A 和 B的信息

https://imgs.lambdahru.com/images/20210801205409.png#crop=0&crop=0&crop=1&crop=1&id=Ohuvl&originHeight=970&originWidth=1426&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

开始阅读

然后就可以开始DEBUG模式开始阅读源码啦 https://imgs.lambdahru.com/images/202112272208318.png#crop=0&crop=0&crop=1&crop=1&id=xSUOM&originHeight=970&originWidth=1426&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=

其他

  • Gradle: 6.5
  • JDK: 1.8
  • OS: windows10
  • IDEA: 2021.2