# Spring源码阅读环境搭建


阅读 Spring 源码前的准备工作，一步一步搭建 Spring 源码阅读环境
<!--more-->


## 准备工作
首先安装 [Gradle](https://gradle.org/)并配置好环境变量。
![](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` 用户
```shell
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=)

```groovy
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](https://github.com/spring-projects/spring-framework)克隆源码，我使用的 `v5.3.9`版本。也可以下载源码压缩包，但是必须进行一次 `commit` 否则会报错
```shell
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` , `B`和 `Main` 类。用于测试
```java
public class Main {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
	}
}
```

```java
@Configurable
@ComponentScan("org.spring.demo.**")
public class AppConfig {
}
```

```java
@Component
public class A {
	@Autowired
	B b;

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

```java
@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

