Spring boot熱部署實戰


1.介紹

在開發工程中,修改一點兒代碼,想看效果就需要重新啟動服務,這樣會花費大量時間在重啟服務上,通過devtools熱部署可以大大減少重啟服務的時間。

之所以能減少時間,是因為Spring Boot自動重啟的原理在於使用兩個classloader:不改變的類(如第三方jar)由base類加載器加載,正在開發的類由restart類加載器加載。應用重啟時,restart類加載器被扔掉重建,而base類加載器不變,這種方法意味着應用程序重新啟動通常比“冷啟動”快得多,因為base類加載器已經可用並已填充。

注意:不同的IDE效果不一樣,Eclipse中保存文件即可引起classpath更新(需要打開自動編譯),從而觸發重啟。而IDEA則需要自己手動command+F9(Mac OS X 10.5+版本的快捷鍵,其他版本的可能有所不同,根據自己的情況而定)重新編譯一下

 

spring為開發者提供了一個名為spring-boot-devtools的模塊來使Spring Boot應用支持熱部署,提高開發者的開發效率,無需手動重啟Spring Boot應用。

devtools的原理

深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另一個ClassLoader加載會更改的類,稱為restart ClassLoader,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,重新創建一個restart ClassLoader,由於需要加載的類相比較少,所以實現了較快的重啟時間。

這里我沒有把所有的方式都嘗試一遍,只是使用了devtools的方式

總的來說,一共需要兩個步驟:

第一步、先設置我們的pom.xml文件,加入依賴

首先是把下面代碼在<dependencies>中

  1.  
    <!--添加熱部署-->
  2.  
    <dependency>
  3.  
    <groupId>org.springframework.boot</groupId>
  4.  
    <artifactId>spring-boot-devtools</artifactId>
  5.  
    <optional>true</optional>
  6.  
    <scope>true</scope>
  7.  
    </dependency>

另外下面的代碼是放在<build>  下面<plugins>里的

  1.  
    <plugin>
  2.  
    <!--熱部署配置-->
  3.  
    <groupId>org.springframework.boot</groupId>
  4.  
    <artifactId>spring-boot-maven-plugin</artifactId>
  5.  
    <configuration>
  6.  
    <!--fork:如果沒有該項配置,整個devtools不會起作用-->
  7.  
    <fork>true</fork>
  8.  
    </configuration>
  9.  
    </plugin>

第二步、設置IDEA的自動編譯:

(1)File-Settings-Compiler勾選 Build Project automatically

(2)快捷鍵 ctrl + shift + alt + /,選擇Registry,勾上 Compiler autoMake allow when app running

這樣我們的熱部署就完成了,可以再我們的項目中修改返回值,或者修改Mapping的value值后,在我們的頁面中刷新試試,

我們的修改已經生效了,不用通過再關閉再開啟項目查看了。

 

例子:

 

pom.xml文件:

<!-- Spring Boot啟動器父類 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<!-- Spring Boot web啟動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 防止將devtools依賴傳遞到其他模塊中 -->
</dependency>
</dependencies>
啟動類Application:

package com.songguoliang.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
* @Description
* @Author sgl
* @Date 2018-05-02 14:51
*/
@SpringBootApplication
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}


}


添加依賴
集成devtools只需要添加下面的依賴即可,通過<optional>true</optional>可防止依賴傳遞。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 防止將devtools依賴傳遞到其他模塊中 -->
</dependency>


測試
我們先啟動服務,然后再創建HelloController,代碼如下:

package com.songguoliang.springboot.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @Description
* @Author sgl
* @Date 2018-05-09 10:21
*/
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}

}

此時我們無需重啟服務,便可以訪問http://localhost:8080/hello,(注:eclipse需開啟自動編譯,idea需要重新編譯)

 


免責聲明!

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



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