缓存选项通常由您的application.properties
文件中的设置进行配置。 例如,Thymeleaf提供了spring.thymeleaf.cache
属性。 而不需要手动设置这些属性,spring-boot-devtools
模块将自动应用合理的开发配置。
有关应用的属性的完整列表,请参阅DevToolsPropertyDefaultsPostProcessor。
20.2、自动重启
使用spring-boot-devtools
的应用程序将在类路径上的文件发生更改时自动重启。 在IDE中工作时,这是一个非常有用的功能,因为它为代码更改提供了一个非常快速的反馈循环。 默认情况下,将监视指向文件夹的类路径中的任何条目以进行更改。 请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。
由于DevTools监视类路径资源,触发重启的唯一方法是更新类路径。 导致类路径更新的方式取决于您使用的IDE。 在Eclipse中,保存修改后的文件将导致类路径更新并触发重启。 在IntelliJ IDEA中,构建项目(Build - > Make Project
)将具有相同的效果。
您也可以通过受支持的构建插件(即Maven和Gradle)启动您的应用程序,只要启用了分叉功能,因为DevTools需要隔离的应用程序类加载器才能正常运行。 当Gradle和Maven在类路径中检测到DevTools时,默认会这样做。
与LiveReload一起使用时,自动重新启动的效果非常好。 详情请参阅下文。 如果使用JRebel,自动重新启动将被禁用,以支持动态类重新加载。 其他devtools功能(如LiveReload和属性覆盖)仍然可以使用。
DevTools依靠应用程序上下文的关闭挂钩在重新启动期间关闭它。 如果您禁用了关闭挂钩(SpringApplication.setRegisterShutdownHook(false)
),它将无法正常工作。
当确定类路径上的条目在更改时会触发重新启动时,DevTools会自动忽略名为spring-boot,spring-boot-devtools
,spring-boot-autoconfigure
,spring-boot-actuator
和spring-boot-starter
的项目。
DevTools需要自定义ApplicationContext
使用的ResourceLoader
:如果你的应用程序已经提供了一个,它将被打包。 不支持直接覆盖ApplicationContext
上的getResource
方法。
重启(restart) vs 重新加载(reload)
Spring Boot提供的重启技术通过使用两个类加载器来工作。 不改变的类(例如来自第三方jar的类)被加载到基类加载器中。 您正在开发的类将加载到重启类加载器中。 当应用程序重新启动时,重启类加载器将被丢弃,并创建一个新的。 这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为基类加载器已经可用并且已经被填充了。
如果您发现重新启动对于您的应用程序来说不够快,或者遇到类加载问题,则可以考虑从ZeroTurnaround中获取重新加载的技术,例如JRebel。 这些工作通过重写类,因为他们被加载,使他们更容易重新加载。 Spring Loaded提供了另一种选择,但是它不支持许多框架,并且没有商业支持。
20.2.1、排除某些资源(如静态资源)
某些资源不一定需要在更改时触发重新启动。 例如,Thymeleaf
模板可以就地编辑。 默认情况下,更改/META-INF/maven
,/META-INF/resources
,/resources
,/static
,/public
或/templates
中的资源不会触发重新启动,但会触发实时重新加载。 如果你想自定义这些排除,你可以使用spring.devtools.restart.exclude
属性。 例如,要仅排除/static
和/public
,您可以设置以下内容:
spring.devtools.restart.exclude=static/**,public/**
如果要保留这些默认值并添加其他排除项,请改为使用spring.devtools.restart.additional-exclude
属性。
20.2.2、监视额外的其他路径(Watching additional paths)