Spring boot實現(xiàn)熱部署的兩種方式詳解
熱部署是什么
大家都知道在項目開發(fā)過程中,常常會改動頁面數(shù)據(jù)或者修改數(shù)據(jù)結(jié)構(gòu),為了顯示改動效果,往往需要重啟應(yīng)用查看改變效果,其實就是重新編譯生成了新的 Class 文件,這個文件里記錄著和代碼等對應(yīng)的各種信息,然后 Class 文件將被虛擬機的 ClassLoader 加載。
而熱部署正是利用了這個特點,它監(jiān)聽到如果有 Class 文件改動了,就會創(chuàng)建一個新的 ClaassLoader 進行加載該文件,經(jīng)過一系列的過程,最終將結(jié)果呈現(xiàn)在我們眼前。
類加載機制
Java 中的類經(jīng)過編譯器可以把代碼編譯為存儲字節(jié)碼的 Class 文件,該 Class 文件存儲了各種信息,最終要加載到虛擬機中運行使用。
類加載機制(摘自《深入理解 Java 虛擬機》)
虛擬機把描述類的數(shù)據(jù)從 Class 文件加載到內(nèi)存中,并對數(shù)據(jù)進行校驗、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型。
Spring Boot 實現(xiàn)熱部署
Spring Boot 實現(xiàn)熱部署很簡單,我們使用上一章創(chuàng)建的項目 Springboot 創(chuàng)建簡單的 web 交互應(yīng)用 來演示。
- 使用 Spring Loaded
- 使用 spring-boot-devtools
springloaded
在 POM 文件中添加依賴
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
添加完畢,啟動項目
Note
這次啟動不能直接運行 main 方法了,需要使用
mvn spring-boot:run 啟動,然后隨意在代碼中寫一個 System.out.println("Hi") ,再次調(diào)用那個方法,會發(fā)現(xiàn)控制臺會打印出 Hi。
spring-boot-devtools
添加 POM 文件依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 這個需要為 true 熱部署才有效 --> </dependency>
然后還是使用 mvn spring-boot:run 啟動項目,隨意更改代碼即可看到效果。
如果我們想指定讓 devtools 監(jiān)聽指定文件夾,那么可以在 application.yml 配置
spring.devtools.restart.additional-paths=your path,注意這里需要改成 yml 文件的格式。
Important(特別注意)
可能會有同學按照以上方法處理了都無效。
這里要特別注意下:由于熱部署是監(jiān)聽 Class 文件的變化,它自身不會主動去編譯 Java 文件,所以我們得在 Java 文件改動時,自動編譯成 Class 文件,然后熱部署工具創(chuàng)造的新的類加載器才會加載改變后的 Class 文件。
所以,如果你使用 IDEA 開發(fā)工具的話,記得要把自動編譯打開。

如圖打鉤即可。
由于熱部署的時候是產(chǎn)生了新的類加載器,我們的一個類可能在虛擬機中存在兩個類,比如代碼中就一個 User 類,但是虛擬機中會存在兩個 User ,雖然是同一個 Class 文件,但是卻是兩個獨立的類,這個要清楚。
由于第一次使用熱部署,一開始遇到個很奇怪的問題,A instanceof A == false,明明兩個 A.getClass() 都一樣,但結(jié)果就是 false,還問了幾個朋友,表示都沒遇到,后來當我把 devtools 依賴注釋后,才正確執(zhí)行。
如果有遇到類似問題的朋友,可以檢查下是不是由于不同的 ClassLoader 造成的。
本系列所有代碼已同步到 GitHub, 項目地址 github:sboot-learn,大家也可以通過本地進行下載。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
idea下如何設(shè)置項目啟動的JVM運行內(nèi)存大小
這篇文章主要介紹了idea下如何設(shè)置項目啟動的JVM運行內(nèi)存大小問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
BeanUtils.copyProperties在拷貝屬性時忽略空值的操作
這篇文章主要介紹了BeanUtils.copyProperties在拷貝屬性時忽略空值的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
詳細講解springboot如何實現(xiàn)異步任務(wù)
異步:異步與同步相對,當一個異步過程調(diào)用發(fā)出后,調(diào)用者在沒有得到結(jié)果之前,就可以繼續(xù)執(zhí)行后續(xù)操作。也就是說無論異步方法執(zhí)行代碼需要多長時間,跟主線程沒有任何影響,主線程可以繼續(xù)向下執(zhí)行2022-04-04
SpringBoot集成Curator實現(xiàn)Zookeeper基本操作的代碼示例
Zookeeper是一個Apache開源的分布式的應(yīng)用,為系統(tǒng)架構(gòu)提供協(xié)調(diào)服務(wù),ZooKeeper的目標就是封裝好復(fù)雜易出錯的關(guān)鍵服務(wù),將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶,本文給大家介紹了SpringBoot集成Curator實現(xiàn)Zookeeper基本操作,需要的朋友可以參考下2024-05-05
Springboot實現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場景)
這篇文章主要介紹了Springboot實現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場景),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11

