SpringBoot系列隨筆 - BootJar的啟動方式


前言

寫完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 -


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM