Spring Boot應用啓動流程初探

        用了一段時間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等,有點暈,先此結筆,後面再補充完善了……

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