使用spring-boot-devtools
的应用程序会在类路径上的文件发生更改时自动重启。在IDE中工作时,这是一个非常有用的功能,因为它为代码更改提供了一个非常快速的反馈循环。默认情况下,类路径中任何指向文件夹的条目都被监测是否发生变化。请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。
触发重启
由于DevTools监视类路径上的资源,触发重启的唯一方法是更新类路径。导致类路径更新的方式取决于您使用的IDE。在Eclipse中,保存修改后的文件将导致类路径更新并触发重启。在IntelliJ IDEA中,构建项目(Build -> Make Project
)将具有相同的效果。
只要启用了fork功能,您也可以通过受支持的构建插件(即Maven和Gradle)启动应用程序,因为DevTools需要一个单独的应用程序类加载器才能正常工作。当在类路径中检测到DevTools时,Gradle和Maven默认就会这样做。
与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
方法。
重启vs重载
Spring Boot提供的重启技术通过使用两个类加载器来工作。不改变的类(例如来自第三方的jar文件)被加载到基类加载器中。您正在开发的类将加载到重启类加载器中。当程序重启时,重启类加载器被丢弃,并创建一个新的。这种方法意味着程序重启通常比“冷启动”快得多,因为基类加载器已经可用并且填充好了。
如果您发现重启对于您的程序来说不够快,或者遇到类加载的问题,那么可以考虑重载技术,如来自ZeroTurnaround的JRebel。重载技术通过在加载类时对其进行重写使类更容易被重载来达到目的。Spring Loaded提供了另一种选择,然而它并不支持太多框架而且没有商业支持。