![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SMxYjN1AjZkR2NxUzY2ATYhRDZ0UTOwQDOyQjMzUGZl9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
Spring架構的重要程度不言而喻!
在嘗試閱讀Spring源碼時,在第一步搭建環境上被勸退很多次(确實比較複雜),而且網上搜了很多部落格、文章後發現,不是Spring版本老,就是Gradle或者Idea版本老。于是昨天肝到深夜,參考了很多資料,終于搭建成功了Spring5.3.x版本的源碼環境!
在分析Spring架構源碼之前,首先要搭建起來Spring的源碼環境,由于Spring源碼并不是托管于maven的,而是托管于Gradle,是以我們需要先下載下傳版Gradle,此外還額外需要本機電腦組態JDK11環境(必須是11,否則Spring源碼環境編譯過不去)。下面我們就從安裝環境開始:
先統一下環境版本要求:
Spring源碼版本5.x
Gradle6.4.x及其以上版本
Jdk11(最好是11,jdk8也可以,但是不敢保證一遍成功)
一、JDK11 安裝
下載下傳與安裝
Oracle官方下載下傳位址:
https://www.oracle.com/java/technologies/javase-jdk11-downloads.html我的電腦是Win10,是以下載下傳下面這個安裝包:
- 如果官網下載下傳速度慢,這裡提供一個百度雲連結: https://pan.baidu.com/s/1LOUVsO2orCUtKRdjOKqGCA ,提取碼:qqo5
- 下載下傳完成後執行exe安裝包,自己選一個安裝路徑(我的是預設路徑),點選下一步:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 等待安裝完成:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境
配置環境變量
- 右鍵 -> 我的電腦 -> 屬性:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 選擇 -> 進階系統設定 -> 環境變量:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 選擇建立系統環境變量JAVA_HOME:
變量名:JAVA_HOME
變量值:jdk安裝的位址(我使用的是預設位址:C:\Program Files\Java\jdk-11.0.6)
注意:如果本機安裝由jdk8 的環境,這裡隻需要找到JAVA_HOME并将變量值修改為jdk11的安裝路徑即可~
在系統環境變量CLASSPATH中新增如下内容:
- 變量名: CLASSPATH
- 變量值:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
- 注意,一定不要忽略了前面的英文句号
啊!.
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 最後一步,找到系統變量中的Path,加入如下内容:
-
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
點選确定,并通過
cmd
檢視環境變量配置是否生效:
java -version
JDK8更換JDK11遇到的問題:
更換JDK版本後,修改環境變量,cmd檢視版本時仍為jdk8的解決辦法:
https://blog.csdn.net/qq_26369317/article/details/80922425二、Gradle5.6.3 的安裝
下載下傳位址:
https://services.gradle.org/distributions/gradle-x.x-bin.zip是需要下載下傳的安裝釋出版(使用這個就行!注意:這裡建議大家下載下傳Gradle6.4.x的版本,在寫這篇文章的時候我采用的是Gradle5.6.3這個版本,後來有些粉絲私信反應Spring5.3.x,用Gradle5.x的版本好像會有一些問題,但是不是每個人都出問題,是以為了順應新版本的Spring,建議盡量采用6.x版本的Gradle!)
gradle-x.x-src.zip是源碼
gradle-x.x-all.zip則是下載下傳全部的檔案
下載下傳完畢後,在自己指定的磁盤中建立Gradle檔案夾,并将下載下傳的壓縮包解壓到該檔案夾中:
如下圖所示:
下載下傳解壓完畢後,去進行環境變量的配置,gradle的配置類似于maven和jdk的配置:
右鍵 -> 我的電腦 –> 屬性 –> 進階系統設定 –> 環境變量 –> 系統變量:
在系統變量中新增一個GRADLE_HOME,其值為解壓後的路徑(我的是F:\Gradle\gradle-5.6.3-all\gradle-5.6.3)
- 然後,修改系統Path變量,在Path變量添加
%GRADLE_HOME%\bin
點選确定,然後就通過
cmd
指令去測試一下是否配置成功:
gradle -v
檢視到gradle的版本資訊,配置成功~
建立Gradle的本地jar包倉庫檔案夾
- 在我們解壓gradle的檔案夾下執行
指令:cmd
mkdir .gradle
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 -
則,我們建立的.gradle檔案夾就是用來存放所下載下傳的jar包倉庫主目錄!配置Gradle鏡像在Gradle安裝目錄下的 init.d 檔案夾下,建立一個 init.gradle 檔案:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 -
在該檔案裡面填寫以下配置:
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
def url = repo.url.toString()
if ((repo instanceof MavenArtifactRepository) && (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
}
}
}
三、IDEA中配置Gradle,并搭建Spring源碼環境
IDEA克隆Spring代碼倉庫
GitHub托管的Spring項目位址:
https://github.com/spring-projects/spring-framework使用HTTPS的方式克隆:
https://github.com.cnpmjs.org/spring-projects/spring-framework.git打開IDEA:
- 從遠端GitHub倉庫,将Spring項目源碼克隆到本機:
- 點選克隆等待克隆完畢,項目初始化,當初始化完成後,如果出現如下情況:
說明IDEA未配置Gradle,以及Gradle鏡像!請接着往下操作:
IDEA配置Gradle
- 打開IDEA -> setting -> Build,Execution,Deployment -> Build Tools -> Gradle,如下:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 配置修改如下:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 設定成功後,再繼續往下配置:
修改Spring項目源碼中Gradle相關配置
主要修改的地方如下幾個檔案:
-
-
:這是官方提供的spring源碼導入idea的步驟和注意說明,可以移步: IDEA導入Spring源碼調試必看 了解一下!import-into-idea.md
-
- 2.修改
檔案,下載下傳依賴的網絡速度之不可描述原因,這裡需要加上阿裡雲的maven鏡像倉庫:settings.gradle
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
maven { url "https://maven.aliyun.com/repository/public" }
修改好之後如下圖所示:
3.修改
gradle.properties
檔案,都已經加了詳細注釋:
version=5.3.0-SNAPSHOT
## 設定此參數主要是編譯下載下傳包會占用大量的記憶體,可能會記憶體溢出
org.gradle.jvmargs=-Xmx2048M
## 開啟 Gradle 緩存
org.gradle.caching=true
## 開啟并行編譯
org.gradle.parallel=true
## 啟用新的孵化模式
org.gradle.configureondemand=true
## 開啟守護程序 通過開啟守護程序,下一次建構的時候,将會連接配接這個守護程序進行建構,而不是重新fork一個gradle建構程序
org.gradle.daemon=true
4.修改
build.gradle
檔案,加上使用阿裡雲倉庫,提高下載下傳速度:
repositories {
// 新增2個阿裡鏡像位址
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
// 新增spring插件庫
maven { url "https://repo.spring.io/plugins-release"}
}
- 5.這裡還需要再改一個地方,就是如下位置中的
檔案:gradle-wrapper.properties
這個壓縮包也可以自己下載下傳,不用6.8.3版本的,用自己下載下傳的版本也可以。我這裡用6.8.3版本的壓縮包,是因為,Spring5.3.8源碼預設用的是6.8.3版本的gradle!
Spring源碼的建構、編譯
在Spring源碼的本機位置,打開cmd,執行指令:gradlew :spring-oxm:compileTestJava,去預編譯spring-oxm子產品!
等待指令執行結束:
同上,預編譯spring-core子產品,執行指令
gradlew :spring-core:compileTestJava
,并等待指令執行結束:
到這兒,使用IDEA + Gradle建構Spring5源碼就已經全部完成。
四、源碼環境驗證
最後一部,就是去驗證一下我們搭建的Spring源碼環境是否可以正常運作:
簡單測試:Spring源碼給我們提供了測試環境搭建是否正常的包,測試運作spring-context子產品下的test包:
執行結果如下圖:
功能測試:自己建立一個子產品去測試Spring源碼的功能。在spring-framework項目下建立我們自己的測試module,如下圖所示:
等待子產品建立完畢後,向子子產品的
build.gradle
檔案指定位置加入如下代碼:
compile(project(":spring-context"))
compile("org.aspectj:aspectjrt:1.9.5")
compile("org.aspectj:aspectjweaver:1.9.5")
如下圖:
這裡其實就相當于maven工程的pom.xml檔案,加入上述代碼的目的是為了在子子產品my-spring-test中引入spring-context子產品的依賴。
- 為子子產品建立java目錄結構(IDEA可以自動生成)New -> Directory:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 自動建立如下三個子產品:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 建立完成後結果如下圖:
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境 - 在java包下建立com.myspring.test包,并建立相關測試類以及spring配置檔案:
測試主函數類:
/**
* date: 2021/5/13
* @author csp
* 測試主函數類
*/
public class Main {
public static void main(String[] args) {
// 讀取spring配置檔案
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-test.xml");
// 擷取service的bean對象
UserService userService = (UserService) context.getBean("userService");
// 執行service方法查詢user對象
User user = userService.getUserById(1);
// 輸出user結果
System.out.println(user);
}
}
User實體類:
/**
* date: 2021/5/13
*
* @author csp
* User實體類
*/
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
service接口:
/**
* date: 2021/5/13
* @author csp
* service接口
*/
public interface UserService {
User getUserById(int id);
}
service接口實作類:
/**
* date: 2021/5/13
* @author csp
* service接口實作類
*/
public class UserServiceImpl implements UserService {
@Override
public User getUserById(int id) {
User user = new User();
user.setAge(22);
user.setName("興趣使然の草帽路飛");
return user;
}
}
resources下建立spring配置檔案spring-text.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.xsd">
<!--xml的方式将UserServiceImpl注入ioc容器-->
<bean id="userService" class="com.myspring.test.UserServiceImpl"/>
</beans>
測試運作,輸出如下結果,說明環境搭建沒有問題了:
參考文章:
https://www.cnblogs.com/mazhichu/p/13163979.html- 本篇是Spring源碼系列第一篇,後續會陸續更新,如果對大家有幫助,請三連支援一下!
- 如果搭建出現問題,歡迎評論區留言,及時幫大家解決!
-
超詳細圖解!基于IDEA+Gradle+jdk11搭建Spring架構源碼閱讀環境