1. 程式人生 > >Springboot實現熱部署-devtools

Springboot實現熱部署-devtools

所謂的熱部署:比如專案的熱部署,就是在應用程式在不停止的情況下,實現新的部署

而Springboot在我們每次修改完程式碼之後,可能只是修改下列印的資訊,就得重新啟動App類,這樣太浪費時間,有沒有一種修改完程式碼讓程式自動重啟的方法呢,答案是有的:

  1. spring-boot-devtools 是一個為開發者服務的一個模組,其中最重要的功能就是自動應用程式碼更改到最新的App上面去。原理是在發現程式碼有更改之後,重新啟動應用,但是速度比手動停止後再啟動還要更快,更快指的不是節省出來的手工操作的時間。  
  2. 其深層原理是使用了兩個ClassLoader,一個Classloader載入那些不會改變的類(第三方Jar包),另一個ClassLoader載入會更改的類,稱為  restart ClassLoader  
  3. ,這樣在有程式碼更改的時候,原來的restart ClassLoader 被丟棄,重新建立一個restart ClassLoader,由於需要載入的類相比較少,所以實現了較快的重啟時間(5秒以內)  
新增jar包
  1. <dependency>  
  2.             <groupId>org.springframework.boot</groupId>  
  3.             <artifactId>spring-boot-devtools</artifactId>  
  4.             <optional>true</optional>  
  5.            <scope>true</scope>  
  6. </dependency>  

  1. 新增spring-boot-maven-plugin:  
  2. <build>  
  3.         <plugins>  
  4.             <plugin>  
  5.                 <groupId>org.springframework.boot</groupId>  
  6.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  7.                 <configuration>  
  8.                     <!--fork :  如果沒有該項配置,肯定devtools不會起作用,即應用不會restart -->  
  9.                     <fork>true</fork>  
  10.                 </configuration>  
  11.             </plugin>  
  12.         </plugins>  
  13.    </build>  

說明一下:
  1. 1. devtools會監聽classpath下的檔案變動,並且會立即重啟應用(發生在儲存時機),注意:因為其採用的虛擬機器機制,該項重啟是很快的。  
  2. 2. devtools可以實現頁面熱部署(即頁面修改後會立即生效,這個可以直接在application.properties檔案中配置spring.thymeleaf.cache=false來實現(這裡注意不同的模板配置不一樣)  

實現:
  1. 修改類-->儲存:應用會重啟  
  2. 修改配置檔案-->儲存:應用會重啟  
  3. 修改頁面-->儲存:應用會重啟,頁面會重新整理(原理是將spring.thymeleaf.cache設為false)  

測試方法就是新建個類,配置檔案,看程式是否會重新啟動

注意的地方:

如果設定SpringApplication.setRegisterShutdownHook(false),則自動重啟將不起作用。(配置檔案中)另外說明一點,有的時候json資料在瀏覽器頁面輸出的時候,可能是亂碼,解決方法是:新建一個配置檔案:application.properties
  1. spring.http.encoding.force=true
  2. spring.http.encoding.charset=UTF-8  
  3. spring.http.encoding.enabled=true
  4. server.tomcat.uri-encoding=UTF-8