1. 程式人生 > >Spring Boot 菜鳥教程 5 熱部署 devtools模組

Spring Boot 菜鳥教程 5 熱部署 devtools模組

GitHub

devtools模組

devtools模組,是為開發者服務的一個模組。主要的功能就是程式碼修改後一般在5秒之內就會自動重新載入至伺服器,相當於restart成功。

原理分析

簡單原理

在發現程式碼有更改之後,自動重新啟動應用,但是其速度比手動停止後再啟動還要快些,更快這裡指的不是節省出來的手工操作的時間

底層原理:雙類載入器機制

  • 一個Base ClassLoader載入器,用於載入不會改變的第三方依賴的jar;
  • 另一個Restart ClassLoader載入器,用於載入自己編寫的類;
  • 執行流程:當應用重啟後,原先的Restart ClassLoader被丟掉、重新new一個Restart ClassLoader來載入這些修改過的東西,而Base ClassLoader卻沒有變化。這就是devtools重啟速度快的原因。

注意事項

  • pom.xml裡面plugin不配置fork=true實測也是可以的
  • application.properties需要配置:新增那個目錄的檔案需要restart
    spring.devtools.restart.additional-paths=src/main/java

專案圖片

這裡寫圖片描述

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
>
<modelVersion>4.0.0</modelVersion> <groupId>com.jege.spring.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-mybatis</name
>
<url>http://maven.apache.org</url> <!-- 公共spring-boot配置,下面依賴jar檔案不用在寫版本號 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 熱部署 --> <!-- devtools可以實現頁面熱部署(即頁面修改後會立即生效,這個可以直接在application.properties檔案中配置spring.thymeleaf.cache=false來實現) --> <!-- 實現類檔案熱部署(類檔案修改後不會立即生效),實現對屬性檔案的熱部署。 --> <!-- 即devtools會監聽classpath下的檔案變動,並且會立即重啟應用(發生在儲存時機),注意:因為其採用的虛擬機器機制,該項重啟是很快的 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- optional=true,依賴不會傳遞,該專案依賴devtools;之後依賴boot專案的專案如果想要使用devtools,需要重新引入 --> <optional>true</optional> </dependency> </dependencies> <build> <finalName>spring-boot-devtools</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 如果沒有該項配置,實際測試ok --> <!-- <fork>true</fork> --> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> </build> </project>

配置檔案application.properties

#新增那個目錄的檔案需要restart
spring.devtools.restart.additional-paths=src/main/java
#排除那個目錄的檔案不需要restart
spring.devtools.restart.exclude=static/**,public/**

控制器HelloController

package com.jege.spring.boot.devtools;

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

/**
 * @author JE哥
 * @email [email protected]
 * @description:看看devtools模組的快速
 */
@RestController
public class HelloController {

  @RequestMapping("/hello")
  public String hello() {
//    System.out.println("test");
    return "Hello World";
  }
}

執行

  • 執行Application之後,修改HelloController,可以看到快速重啟,載入即時生效

擴充套件

  • 如果覺得不過癮,還可以去試試使用Spring Loaded或JRebel專案

原始碼地址

如果覺得我的文章或者程式碼對您有幫助,可以請我喝杯咖啡。
您的支援將鼓勵我繼續創作!謝謝!
微信打賞
支付寶打賞