Spring Boot包含一組額外的工具,可以使應用程序開發體驗更加愉快。 spring-boot-devtools模塊可以包含在任何項目中,以提供額外的開發時間功能。
Maven中引入devtools
-
自動重啟
使用spring-boot-devtools的應用程序將在類路徑上的文件發生更改時自動重新啟動。 在IDE中工作時,這可能是一個有用的功能,因為它為代碼更改提供了非常快速的反饋循環。 默認情況下,將監視類路徑上指向文件夾的任何條目的更改。 請注意,某些資源(如靜態資源和視圖模板,也是html,css,js文件的改變不會觸發重啟)不需要重新啟動應用程序。
什么時候觸發重啟
由於DevTools監視類路徑資源,因此觸發重新啟動的唯一方法是更新類路徑。 導致更新類路徑的方式取決於您使用的IDE。 在Eclipse中,保存修改后的文件將導致更新類路徑並觸發重新啟動。 在IntelliJ IDEA中,構建項目(Build - > Make Project)將具有相同的效果。
Spring Boot提供的重啟技術使用兩個類加載器。 不更改的類(例如,來自第三方jar的類)將加載到基類加載器中。 您正在積極開發的類將加載到重新啟動的類加載器中。 重新啟動應用程序時,將重新啟動的類加載器並創建一個新的類加載器。 這種方法意味着應用程序重啟通常比“冷啟動”快得多,因為基類加載器已經可用並已填充。 如果發現重新啟動對於應用程序來說不夠快,或者遇到類加載問題,則可以考慮從ZeroTurnaround重新加載JRebel等技術。 這些工作通過在加載類時重寫類使它們更適合重新加載。 Spring Loaded提供了另一種選擇,但它不支持盡可能多的框架,並且它不受商業支持。
那些資源修改將不會觸發重新啟動
某些資源在更改時不一定需要觸發重啟。 例如,Thymeleaf模板可以就地編輯。 默認情況下,更改/ META-INF / maven,/ META-INF / resources,/ resources,/ static,/ public或/ templates中的資源不會觸發重新啟動,但會觸發實時重新加載。 如果要自定義這些排除項,可以使用spring.devtools.restart.exclude屬性。
例如自定義那個文件改動不觸發重啟:
監視額外的路徑
當您對不在類路徑中的文件進行更改時,您可能希望重新啟動或重新加載應用程序。 為此,請使用spring.devtools.restart.additional-paths屬性配置其他路徑以監視更改。 您可以使用上述spring.devtools.restart.exclude屬性來控制其他路徑下的更改是觸發完全重新啟動還是僅實時重新加載。
禁用重啟
如果您不想使用重啟功能,可以在application.properites中設置spring.devtools.restart.enabled屬性。如果您需要完全禁用重新啟動支持,例如,因為它不能與特定庫一起使用,則需要在調用SpringApplication.run(...)之前設置System屬性。
-
LiveLoad
spring-boot-devtools模塊包含一個嵌入式LiveReload服務器,可用於在資源更改時觸發瀏覽器刷新。 LiveReload瀏覽器擴展程序可從livereload.com免費用於Chrome,Firefox和Safari。 如果您不想在應用程序運行時啟動LiveReload服務器,則可以將spring.devtools.livereload.enabled屬性設置為false。
- 刷新模板不需要重啟容器
Spring Boot支持的大多數模板技術都包含一個禁用緩存的配置選項。 如果您正在使用spring-boot-devtools模塊,那么在開發時將自動為您配置這些屬性。
Thymeleaf模板
如果您使用的是Thymeleaf,將spring.thymeleaf.cache設置為false
FreeMarker模板
如果您使用的是FreeMarker,將spring.freemarker.cache設置為false
Groovy模板
如果您使用的是Groovy模板,將spring.groovy.template.cache設置為false
-
刷新Java類不需要重啟容器
現代IDE(Eclipse,IDEA等)都支持字節碼的熱交換,因此如果您進行的更改不會影響類或方法簽名,則應該重新加載,沒有任何副作用。 Spring Loaded更進一步,它可以通過方法簽名的更改重新加載類定義。 通過一些自定義,它可以強制ApplicationContext自行刷新(但是沒有通用的機制來確保對於正在運行的應用程序來說是安全的,所以它可能只是一個開發時間技巧)。