1.Developer Tools

spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去,即在我们改变了一些代码或者配置文件的时候,应用可以自动重启,这在我们开发的时候,非常有用。

要包含devtools支持,需要将​​spring-boot-devtools​​模块依赖添加到项目构建中

2.maven依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

在运行完全打包的应用程序时,开发工具会自动被禁用,如果您的应用程序是从​​java -jar​​​启动的,或者是从一个特殊的类加载器开始的,那么它就被认为是一个“生产应用程序”。将依赖项标记为Maven中的可选项​​<optional>true</optional>​​​是一种最佳实践,它可以防止​​devtools​​被传递到其他使用你的项目的模块中。

3.属性默认值 Property Defaults

Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。另外,Spring MVC可以在服务静态资源时将HTTP缓存头添加到响应中。

虽然缓存在生产中非常有用,但它在开发过程中会起到反作用,使我们无法看到在应用程序中所做的更改。因此,​​spring-boot-devtools​​默认禁用缓存选项。

缓存选项通常由​​application.properties​​​文件中的设置进行配置。例如,如要禁用Thymeleaf的缓存功能可以配置​​spring.thymeleaf.cache​​​为false。引入​​spring-boot-devtools​​​模块后不需要手动设置这些属性,​​spring-boot​​自动应用合理的开发时配置。

有关devtools自动应用的属性的完整列表,可参阅
​​​DevToolsPropertyDefaultsPostProcessor​

以下是​​DevToolsPropertyDefaultsPostProcessor​​的部分源码:

@Order(Ordered.LOWEST_PRECEDENCE)
public class DevToolsPropertyDefaultsPostProcessor implements EnvironmentPostProcessor {

private static final Map<String, Object> PROPERTIES;

static {
Map<String, Object> devToolsProperties = new HashMap<>();
devToolsProperties.put("spring.thymeleaf.cache", "false");
devToolsProperties.put("spring.freemarker.cache", "false");
devToolsProperties.put("spring.groovy.template.cache", "false");
devToolsProperties.put("spring.mustache.cache", "false");
devToolsProperties.put("server.servlet.session.persistent", "true");
devToolsProperties.put("spring.h2.console.enabled", "true");
devToolsProperties.put("spring.resources.cache.period", "0");
devToolsProperties.put("spring.resources.chain.cache", "false");
devToolsProperties.put("spring.template.provider.cache", "false");
devToolsProperties.put("spring.mvc.log-resolved-exception", "true");
devToolsProperties.put("server.servlet.jsp.init-parameters.development", "true");
devToolsProperties.put("spring.reactor.stacktrace-mode.enabled", "true");
PROPERTIES = Collections.unmodifiableMap(devToolsProperties);
}

4.自动重启

使用​​spring-boot-devtools​​的应用程序在类路径更改时自动重新启动。当在IDE中工作时,这可能是一个有用的特性,因为它为代码更改提供了非常快速的反馈循环。默认情况下,指向一个文件夹的类路径上的任何条目都会被监控以进行更改。请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序.

触发重启
由于DevTools监控类路径资源,触发重启的唯一方法是更新类路径。导致类路径更新的方式取决于您使用的IDE。在Eclipse中,保存修改后的文件会导致更新类路径并触发重新启动。在IntelliJ IDEA中,构建项目(Build -> Build Project)具有相同的效果

实际开发中不可能每次改动后都手动Build,因此需要设置Idea的自动编译。
File --> Settings --> Compiler --> Build Project automatically
SpringBoot系列课程(三)-devtools与热部署_重新启动
ctrl + shift + alt + / --> Registry --> 勾选Compiler autoMake allow when app running
SpringBoot系列课程(三)-devtools与热部署_spring_02
SpringBoot系列课程(三)-devtools与热部署_类加载器_03
重新启动和重新加载

Spring Boot提供的重启技术使用两个类加载器。不改变的类(例如,来自第三方jar的类)被加载到一个基类加载器中,正在积极开发的类被加载到重启类加载器中,当应用程序重新启动时,重启类加载器将被丢弃,并创建一个新的类加载器。这种方法意味着应用程序重新启动通常要比“冷启动”快得多,因为基类加载器已经可用并填充了。

5.排除的资源 Excluding Resources

某些资源不一定需要在更改时触发重新启动。例如,可以就地编辑Thymeleaf模板。默认情况下,改变/META-INF/maven,/META-INF/resources,/resources,/static,/public,或 /templates路径下的资源不会触发重启但会触发重新加载。可以使用​​spring.devtools.restart.exclude​​​属性来自定义排除的资源。例如,要仅排除​​/static,/public​​可以设置以下属性:

spring.devtools.restart.exclude=static/**,public/**

6.侦听其他路径 Watching Additional Paths

你可能想在你修改不在类路径下的文件时让你的应用触发重新启动或重新加载。要做到这点,可以使用​​spring.devtools.restart.additional-paths​​​ 属性来配置需要额外监控的路径。您可以使用前面描述的​​spring.devtools.restart.exclude​​属性 来控制其他路径下的更改是否会触发完全重新启动或 实时重新加载。

7.禁用重启

如果你不想使用重新启动功能,则可以使用该spring.devtools.restart.enabled属性将其禁用 。在大多数情况下,你可以在application.properties设置这个属性(这样做仍然可以初始化重启类加载器,但它不会监视文件的变化)。

如果您需要完全禁用重新启动支持(例如,因为它不适用于特定的库),则需要在调用​​SpringApplication.run(…)​​​之前将​​spring.devtools.restart.enabled System​​​ 属性设置为​​false​​,如下例所示:

public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}

完整devtools特性请参考官方文档
​​​https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-disable​