Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

前言

工慾善其事必先利其器。學習和深讀Spring源碼一個重要的前提:編譯源碼到我們的本地環境。這樣方便我們在本地環境添加註釋、斷點追蹤、查看類或接口的繼承關係等等,更加高效的學習Spring源碼。個人覺得深讀Spring源碼對我們的編碼水平會有很大很大的提升,因爲其牽涉的廣度、深讀、以及優秀編碼規範都值得我們去品、細品、慢慢品。廢話不多說,本篇就如何在我們的intelliJ IDEA編譯Spring源碼的步驟以及在編譯的過程中遇到的問題做一個詳細說明。

環境

  • 開發工具: IntelliJ IDEA 20193.3
  • 編譯工具: gradle-6.4-rc-4
  • 操作系統: windows 10

編譯

一、下載Spring源碼

訪問Spring官方源碼地址 https://github.com/spring-projects/spring-framework.git,下載源碼zip包到本地

二、下載和配置編譯工具Gradle

1. 下載Gradle

訪問Gradle官網 https://services.gradle.org/distributions/,選擇gradle-6.4-rc-4-bin.zip(截止2020-05-03當前最新),下載到本地並解壓

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

2. 配置Gradle系統環境變量

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

3. 驗證Gradle

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

三、IntelliJ IDEA編譯Spring源碼

1. 導入Spring源碼至IntelliJ IDEA

將之前下載好的Spring源碼解壓後導入到IDEA,依次點擊File->New->Project from Existing Sources,選擇源碼包路徑下的build.gradle文件完成源碼導入

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

2. IntelliJ IDEA配置Gradle

依次打開File->Settings

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

3. 開始編譯

在編譯開始之前,我們先看看下載的官方源碼裏給出的導入IDEA的提示

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

按照上面描述,因爲上面導入我是按照第二步去做的。最後僅僅只需做第1條,預編譯spring-oxm。進入項目路徑,執行以下命令完成spring-oxm的預編譯即可

gradlew :spring-oxm:compileTestJava

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

完成了spring-oxm的預編譯之後,就可以編譯我們的代碼了,一般由IDEA自動幫我們完成源碼到projects的轉換,也可以由我們手動import。

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

自此,編譯的整個過程已經完成。下面我們要做的事就是添加自己的模塊對已編譯的項目模塊進行驗證測試,相信我驗證會是一個有趣的過程。

測試

打開源碼我們可以看到每個模塊都對應的有單元測試,再相比較平時自己在開發時乾的事情。再想到流行的敏捷開發模式中的TDD(測試驅動開發),沒有測試就沒有功能代碼。不禁覺得其中的優秀是爲了讓我望塵而嘆。

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

扯回正題,不能讓你們覺得我扯廢話湊字數暴露沒啥水平的真實情況。上面說到各個模塊的單元測試我們可以測試編譯項目是否有問題,但是後續學習在於模塊之間的整合之上。所以我在此添加一個新的模塊,這個模塊模擬一個bean的創建和獲取這麼個過程。

1. 創建模塊spring-demo

依次右擊項目->New->Module

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

2. 添加測試模塊代碼

先預覽下添加的代碼結構吧,很簡單是不?加上需要添加依賴的build.gradle共5個文件。

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

我這裏貼出這5個文件的代碼

@Configuration
@ComponentScan("com.fly4j.spring.context.**")
public class ContextConfig {
}
public interface IUserService {
}
@Service
@Scope("singleton")
public class UserServiceImpl implements IUserService {
	public UserServiceImpl() {
		System.out.println(this.getClass().getSimpleName() + " 構造函數執行...");
	}
}
public class ContextApplication {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
				ContextConfig.class
		);
	    IUserService bean = context.getBean(IUserService.class);
		System.out.println(bean);
	}
}
// build.gradle
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile(project(":spring-context"))
    compile(project(":spring-instrument"))
}

相信以上代碼機智的你一看就明白其意,其中build.gradle就只添加了spring-context和spring-instrument的依賴,spring-context模塊裏包含了bean工廠,可想而知,我這裏生成bean和取出bean的測試案例是多麼的依賴這個模塊,另一個spring-instrument是spring-context模塊編譯需要的。

3. 測試

運行ContextApplication的main方法,其中會提示找不到CoroutinesUtils符號,這個問題解決我在下面一節的“問題一”進行了說明,我這裏先放結果好了。

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

如上可以看到從上下文注入bean和取出bean的過程,至此spring-context這個重要模塊驗證成功結束。

問題

1. 問題一

Error:(350, 51) java: 找不到符號
  符號:   變量 CoroutinesUtils
  位置: 類 org.springframework.core.ReactiveAdapterRegistry.CoroutinesRegistrar

解決: 依次File->Project Structure->Libraries->+->java->spring-core->kotlin-coroutines->build->libs->kotlin-coroutines-5.3.0-SNAPSHOT.jar

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

Spring源碼解析1:IntelliJ IDEA2019.3編譯Spring5.3.x源碼

 

2. 問題二

Error:(26, 38) java: 找不到符號
  符號:   類 InstrumentationSavingAgent
  位置: 程序包 org.springframework.instrument

解決: 因爲spring-context對spring-instrument有依賴,在build.gradle添加對spring-instrument的依賴即可。

結語

至此,Spring源碼如何在IntelliJ IDEA如何編譯這篇文章就廢話完畢了。寫這篇文章目的我希望把它作爲Spring系列的開始,沒有環境的學習就像你想擡一個沒有邊角的桌子無處施力。期待後續更新的同學可以持續關注博主。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章