說明
Spring源碼閱讀環境配置如下:
- Spring 5.x版本
- Gradle 4.8.1
- JDK8
- IDEA2020.1
- win10
搭建步驟
1. 下載Spring源碼
下載地址:Github鏈接,選擇5.x版本
如果Github下載過慢,可以使用碼雲加速,鏡像地址
另一種辦法是通過梯子配置代理,也可以加速下載
2. 配置Gradle
Spring基於gradle構建,需要先安裝配置Gradle
Gradle下載地址,選擇complete版本,下載后加入環境變量,通過gradle -v驗證是否配置成功

3. 構建項目
在進行預編譯之前,需要檢查以下幾個地方:
- gradle.properties: 查看版本是否正確
- jdk版本和gradle版本
在代碼目錄下執行命令:
gradlew :spring-oxm:compileTestJava
等待編譯成功。編譯過程可能遇到如下問題:
- An exception occurred applying plugin request [id: 'com.gradle.build-scan', version: '1.8']
解決辦法:Gradle版本問題,具體原因參考此鏈接
| Gradle Build Tool versions | Minimum plugin version | Maximum plugin version |
|---|---|---|
| >= 6.0 | 3.0 | 3.3.1 |
| 5.0 - 5.6.4 | 2.0.2 | 3.3.1 |
| 4.1 - 4.10 | 1.8 | 1.16 |
| 4.0 | 1.7.4 | 1.16 |
| 2.0 - 3.5 | 1.0 | 1.16 |
| < 2.0 | not supported | not supported |
- org.gradle.api.CircularReferenceException: Circular dependency between the following tasks:
:spring-beans:compileGroovy
--- :spring-beans:compileJava
--- :spring-beans:compileKotlin
--- :spring-beans:compileGroovy (*)
解決辦法:循環引用問題,注釋掉下面三行

4. 導入IDEA
File -> New -> Project from Existing Sources -> 找到 Spring 項目路徑 -> 選中 build.gradle,並配置gradle,如下圖所示

接下來idea會進行很長時間的build,下載相關jar包,耐心等待即可
可能出現如下問題:
- 缺少jar包:spring-cglib-repack-x.x.x.jar、spring-objenesis-repack-x.x.jar
解決辦法:在spring的解壓目錄下執行下面這兩個命令
gradle objenesisRepackJar
gradle cglibRepackJar
調試代碼
新建module,編寫自己的代碼,對spring代碼進行走讀。
關於module相關知識,可以參考另一篇文章:IDEA中Project和Module的關系
項目右擊,New->Module


當然也可以創建基於Maven的module,如下所示:

創建module子項目以后,需要添加module依賴,方便導入相關包。如下所示:

至此,可以寫代碼了。我們創建一個簡單的java bean,並打印。
Person.java:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="person" class="org.wds.Person">
<property name="name" value="zhangsan"/>
</bean>
</beans>
Main.java:
public class Main {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Person obj = (Person) context.getBean("person");
System.out.println(obj.getName());
}
}
運行結果如下所示:

至此,環境搭建成功,可以通過打斷點對源代碼進行調試和走讀。
