前言
寫完maven的加密插件后,嘗試在boot啟動時的類加載過程中編寫解密代碼時,發現了一個平常沒有注意的地方.
那就是boot-jar的啟動方式與我們平常編寫的可執行jar是存在很大差別的.
所以在這里進行簡單的記錄,暫時不對一些復雜機制進行.如repackage階段對jar文件進行的額外處理,boot-jar加載資源的的實現方式,classLoader實現的擴展等
開始
整體流程直接使用時序圖進行如下表示
分步描述(必要的)
- 步驟1 - 由虛擬機觸發,調用類
org.springframework.boot.loader.JarLauncher.main
方法.這一步完全等同於我們使用
java -jar hello.jar
時,調用了自己面寫的main
方法.
而我們所打包的boot-jar,不論如何,最終都會執行語句java -jar boot-jar.jar
,並調用方法org.springframework.boot.loader.JarLauncher.main
- 步驟4-10 - 注冊
JarUrl
協議.這一步的主要作用是向系統注冊新的協議,使boot可以使用自己的方式獲取資源信息(針對boot-jar)
- 步驟11 - 獲取boot-jar內的所有資源定位
結合
JarUrl
協議,就可以獲取資源了 - 步驟13 - 創建並配置類加載器
這個加載器的實現,使用了字節碼技術.達到了越過JVM並對class進行了讀取的效果.
這么做的目的,個人推測應該是為了能夠在掃描所有可能需要加載的類時,保證不讓虛擬機加載它們,以較少虛擬機負擔. - 14-end - 准備並執行我們編寫的main方法
找到我們所表寫的main方法所處的類,並直接使用反射進行調用.
隨着main方法的調用,方法體內的SpringApplication
相關方法也意味着容器的初始化,應用正式啟動 - end -