前言
工欲善其事必先利其器。學習和深讀Spring源碼一個重要的前提:編譯源碼到我們的本地環境。這樣方便我們在本地環境添加注釋、斷點追蹤、查看類或接口的繼承關系等等,更加高效的學習Spring源碼。個人覺得深讀Spring源碼對我們的編碼水平會有很大很大的提升,因為其牽涉的廣度、深讀、以及優秀編碼規范都值得我們去品、細品、慢慢品。廢話不多說,本篇就如何在我們的intelliJ IDEA編譯Spring源碼的步驟以及在編譯的過程中遇到的問題做一個詳細說明。
環境
- 開發工具: IntelliJ IDEA 2019.3.3
- 編譯工具: gradle-6.4-rc-4
- 操作系統: windows 10
- Spring版本:Spring5.3.0
編譯
一、下載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-demo
依次右擊項目->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/hxrui/spring-framework.git