亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring boot實現熱部署的兩種方式詳解

發布時間:2020-10-08 20:18:42 來源:腳本之家 閱讀:141 作者:Be a funny man. 欄目:編程語言

熱部署是什么

大家都知道在項目開發過程中,常常會改動頁面數據或者修改數據結構,為了顯示改動效果,往往需要重啟應用查看改變效果,其實就是重新編譯生成了新的 Class 文件,這個文件里記錄著和代碼等對應的各種信息,然后 Class 文件將被虛擬機的 ClassLoader 加載。

而熱部署正是利用了這個特點,它監聽到如果有 Class 文件改動了,就會創建一個新的 ClaassLoader 進行加載該文件,經過一系列的過程,最終將結果呈現在我們眼前。

類加載機制

Java 中的類經過編譯器可以把代碼編譯為存儲字節碼的 Class 文件,該 Class 文件存儲了各種信息,最終要加載到虛擬機中運行使用。

類加載機制(摘自《深入理解 Java 虛擬機》)

      虛擬機把描述類的數據從 Class 文件加載到內存中,并對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型。

Spring Boot 實現熱部署

Spring Boot 實現熱部署很簡單,我們使用上一章創建的項目 Springboot 創建簡單的 web 交互應用 來演示。

  • 使用 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") ,再次調用那個方法,會發現控制臺會打印出 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 監聽指定文件夾,那么可以在 application.yml 配置
spring.devtools.restart.additional-paths=your path,注意這里需要改成 yml 文件的格式。

Important(特別注意)

可能會有同學按照以上方法處理了都無效。

這里要特別注意下:由于熱部署是監聽 Class 文件的變化,它自身不會主動去編譯 Java 文件,所以我們得在 Java 文件改動時,自動編譯成 Class 文件,然后熱部署工具創造的新的類加載器才會加載改變后的 Class 文件。

所以,如果你使用 IDEA 開發工具的話,記得要把自動編譯打開。

Spring boot實現熱部署的兩種方式詳解

如圖打鉤即可。

由于熱部署的時候是產生了新的類加載器,我們的一個類可能在虛擬機中存在兩個類,比如代碼中就一個 User 類,但是虛擬機中會存在兩個 User ,雖然是同一個 Class 文件,但是卻是兩個獨立的類,這個要清楚。

由于第一次使用熱部署,一開始遇到個很奇怪的問題,A instanceof A == false,明明兩個 A.getClass() 都一樣,但結果就是 false,還問了幾個朋友,表示都沒遇到,后來當我把 devtools 依賴注釋后,才正確執行。

如果有遇到類似問題的朋友,可以檢查下是不是由于不同的 ClassLoader 造成的。

本系列所有代碼已同步到 GitHub, 項目地址 github:sboot-learn,大家也可以通過本地進行下載。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

章丘市| 龙里县| 阜康市| 西华县| 新乐市| 台前县| 昭苏县| 聂拉木县| 星座| 芒康县| 紫阳县| 客服| 六盘水市| 南丰县| 吴江市| 台东县| 大新县| 阿坝| 益阳市| 东至县| 临潭县| 高要市| 正定县| 星子县| 黄冈市| 柞水县| 阿勒泰市| 昌乐县| 新竹县| 巴彦县| 扎囊县| 清徐县| 兴海县| 西藏| 中宁县| 海南省| 上犹县| 友谊县| 马边| 开阳县| 曲阜市|