1. 程式人生 > >Spring原始碼學習01:IntelliJ IDEA2019.3編譯Spring5.3.x原始碼

Spring原始碼學習01:IntelliJ IDEA2019.3編譯Spring5.3.x原始碼

目錄

Spring原始碼學習01: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當前最新),下載到本地並解壓

2. 配置Gradle系統環境變數

3. 驗證Gradle

三、IntelliJ IDEA編譯Spring原始碼

1. 匯入Spring原始碼至IntelliJ IDEA

將之前下載好的Spring原始碼解壓後匯入到IDEA,依次點選File->New->Project from Existing Sources,選擇原始碼包路徑下的build.gradle檔案完成原始碼匯入

2. IntelliJ IDEA配置Gradle

依次開啟File->Settings

3. 開始編譯

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

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

gradlew :spring-oxm:compileTestJava

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

自此,編譯的整個過程已經完成。下面我們要做的事就是新增自己的模組對已編譯的專案模組進行驗證測試,相信我驗證會是一個有趣的過程。

測試

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

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

1. 建立模組spring-fly4j

如果你們想問這名字有啥深意嗎?抱歉哈..沒有。想起spring-test起不了,你們懂spring有這個模組了,起名障礙啊,強行理解的話:“為了java飛吧”,忍住別笑

依次右擊專案->New->Module

2. 新增測試模組程式碼

先預覽下新增的程式碼結構吧,很簡單是不?加上需要新增依賴的build.gradle共5個檔案。

我這裡貼出這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符號,這個問題解決我在下面一節的“問題一”進行了說明,我這裡先放結果好了。

如上可以看到從上下文注入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

2. 問題二

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

解決: 因為spring-context對spring-instrument有依賴,在build.gradle新增對spring-instrument的依賴即可。

結語

至此,Spring原始碼如何在IntelliJ IDEA如何編譯這篇文章就廢話完畢了。寫這篇文章目的我希望把它作為Spring系列的開始,沒有環境的學習就像你想抬一個沒有邊角的桌子無處施力。如果大家在編譯時有什麼問題歡迎指出。也可以聯絡我(微訊號:WxHXR2015),大家相互學習,在當前環境下自己也是一個擔心有今天沒明天的菜比技術人。最後貼出我編譯好的spring原始碼的地址,歡迎大家star。 https://github.com/haoxianrui/spring-framework.git