用了一段時間Spring Boot進行開發,它的確省了開發人員很多配置的時間,那麼,它背後是怎麼啓動的,今天來探究一下……
(話說,這篇文章標題開始寫於2018年9月某日,今天(2019年11月某日)纔在草稿箱撿起來重新補完,囧大發…………)
以下示例採用SpringBoot2.0.5進行開發測試,其Spring FrameWork版本爲5.0,要求JDK1.8。在使用maven下載鏡像時,爲了加快下載速度,這裏使用阿里雲的鏡像地址:
首先,創建一個最簡單的只有一個starter-web的模塊依賴的spring boot項目,如下:
這裏注意到,這裏有一個父POM直接指向了spring boot的pom,如果需要依賴其他自定義的父POM就不行了,這裏稍作修改如下:
執行mvn package打包後,目錄結構如下:
這兩個jar包,15MB左右的可以java -jar啓動,它包含了很多以來庫,如tomcat等,而.original後綴的文件僅包含該項目應用的本地資源,如編譯後的classes目錄下的資源文件,它並未引入第三方依賴資源,所以佔用空間較小。我們解壓第一個jar包看看:
BOOT-INF/classes目錄存放的是應用編譯後的class文件;
BOOT-INF/lib存放的是應用依賴的JAR包;
META-INF目錄存放的是應用相關的元信息,如MANIFEST.MF文件(根據JAR文件規定,該文件一定存放於META-INF目錄下);
org目錄存放Spring BOOT相關的class文件。
接下來,看看MANIFEST.MF文件,它描述了關於jar包的很多信息:
發現一個特點,有Main-Class和Start-Class,回憶一下剛學Java時,只有一個類文件,如Hello.class,我們是通過java Hello命令去執行的,既然現在知道Main-Class了,我們試下:
應用正常啓動,說明我們自己的Start-Class是被這個啓動類來進行加載並初始化的,而JarLauncher會在BOOT-INF/lib目錄下找到需要類庫依賴去啓動,如下源碼所示,這裏就有一個main函數:
下面是我們代碼中的啓動類:
可以發現,Spring boot項目核心有兩個組件:
1. SpringApplication負責Spring應用程序的啓動
2. @SpringBootApplication註解來簡化應用的配置
整個應用的啓動類爲org.springframework.boot.loader.JarLauncher,其繼承關係如下:
爲了方便看到Launcher源碼,這裏加一個其依賴:
然後打開下載JarLauncher的源碼。
在其源碼可以看到,指定了啓動時去classes路徑BOOT-INF/classes/下和庫路徑BOOT-INF/lib/下查詢archive資源文件然後用默認或自定義的classloader進行加載。真正的啓動代碼在這裏:
囧,跟了下代碼,裏面涉及不少java的東西我還不怎麼了解,如Archive、URLStreamHandler等,有點暈,先此結筆,後面再補充完善了……