springboot自动重启及SpringBoot Developer tools简介
项目中引用了SpringBoot Developer tools,修改类后会自动重启。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
springboot developer tools的作用
用于提升开发体验,比如修改类文件自动重启、修改静态文件热加载、提供属性默认值、远程debug等。打包时,默认并不会将devleloper tools打入,除非禁用excludeDevtools
。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
自动重启的原理
只要ClassPath有文件发生变化就会自动重启,自动重启的原理是,有一个BaseClassLoader加载library中的类,有一个RestartClassLoader加载开发的类,开发的类变更了,则创建新的RestartClassLoader加载开发类,丢弃老的RestartClassLoader;有时,修改了注释、加个空行、都自动重启,这是不合时宜的,而且使用intellij idea本身就会热加载,不需要重启(热加载和重启是不同的),禁用SpringBoot Developer tools的自动重启功能,有两个办法
-
在application.yml或application.properties中配置
spring.devtools.restart.enabled
为false,这种RestartClassLoader仍然加载类,但不再监控类变化。 -
在调用
SpringApplication.run
之前,配置System property完全禁用,这种就不会创建RestartClassLoaderpublic static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args); }
顺便提一句,SpringBoot Developer tools还提供了默认的属性值,比如 template engines (FreeMarker、Thymeleaf、Mustache)默认会缓存编译文件以提高效率,但在开发阶段这是不合时宜的,所以SpringBoot Developer tools提供的spring.thymeleaf.cache
是false,完整的属性默认值可参考DevToolsPropertyDefaultsPostProcessor.