1.简介
参考文档:Developing with Spring Boot
Spring-boot-devtools是Springboot中包含的一款额外的热部署工具。
其原理是通过使用两个类加载器(classloader)来工作,一个base classloader用于加载没有变化的类,比如第三方的jar包,另一个restart classloader 负责加载经常变化的文件,比如classpath中编写的class文件,每次应用重启的时候,restart classloader 就会被丢弃,重新创建一个新restart classloader 来加载classpath中的class文件,而base classloader则无需重新创建,这样就大大减少了启动时间。
Spring-boot-devtools触发重启条件:
- 在eclipse中,保存修改文件会导致classpath中的文件更新,则会触发重启
- 在IDEA中,构建项目,Build, Build Project都会触发重启
- 使用构建插件,比如maven执行mvn compile或者gradle build都会触发重启
注意:对于resources目录中的一些静态文件修改则不会重启服务。但静态文件修改依旧会实时生效。
对比JRebel:
区别1:热重启VS热重载:
Srping-boot-devtools和JRebel最大的区别就是Srping-boot-devtools是热重启,而JRebel是热重载。简单来说Srping-boot-devtools每次变更类都会进行一次重启,而JRebel每次类发生变更只是将变更的类重新加载,因此在效率上JRebel会更快。
区别2:Srping-boot-devtools是免费使用的,JRebel是收费的
2. 环境:
- SpringBoot 2.6.3
- IDEA 2021.2.1
3. 配置步骤:
3.1 配置Sringboot
修改POM.xml 加入spring-boot-devtools依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
修改application.yml
spring:
devtools:
#热部署生效,默认就是true
restart:
enabled: true
然后启动服务进行测试。
测试步骤:
编写一个controller
@Api(tags = "Hello模块")
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello David";
}
}
修改返回值后看控制台是否重启生效,如果代码修改后没有重启,可能的问题是IDE没有设置自动编译功能,需要手动编译(build)一下,或者将IDE设置为自动编译。
3.2 设置IDEA自动编译
当我们修改了java类后,IDEA默认是不自动编译的,而spring-boot-devtools又是监测classpath下的文件发生变化才会重启应用,如果不想每次都点击build project就需要设置IDEA的自动编译
设置方法如下:
在Settings->Build,Excution,Deployment ->Compiler勾选Build project automatically
然后在Settings->Advanced Settings中勾选下面的选项