Spring Boot熱插拔
小弟剛接觸spring boot不久,僅想通過寫網誌的形式來加深記憶和方便以後查閱。如內容有不正確之處,還望各位大佬海量汪涵,並給小弟指出,共同進步。
1.概述
**由於Spring Boot應用程序只是純java應用程序,所以JVM熱插拔可開箱即用(Spring-boot-devtools)。
spring-boot-devtools模塊可以包含在任何項目中,以提供額外的開發功能,添加maven依賴:**
<dependencies>
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-devtools </artifactId>
<optional> true </optional>
</dependency>
</dependencies>
2.屬性默認值
Spring Boot支持的幾個庫使用緩存來提高性能。例如,模塊引擎將編譯的模板存入緩存,以避免重複解析模板文件。此外SpringMVC可以在服務靜態資源時向響應添加Http頭。
3.自動重啓
使用spring-boot-devtools會在類路徑上的文件發生更改時自動重新啓動。但默認情況下有些資源(如靜態資源和視圖模板)不需要重新啓動應用程序。
3.1觸發重新啓動
當DevTools監視類路徑資源時,觸發重新啓動的唯一方法是更新類路徑。
DevTools的工作依賴於應用程序上下文的shutdown hook,如果禁用了shutdown hook,在application配置文件中配置SpringApplication.setRegisterShutdownHook(false),將無法正常工作。
3.2重新啓動與重新加載
Spring Boot提供的重新啓動技術使用兩個類加載器。不更改的類(如,第三方jar)被加載到基類加載器中;正在積極開發的類被加載到重新啓動類加載器中。當應用程序重新啓動時,重新啓動類加載器將被丟棄,並重新創建一個重新啓動類加載器。
如果重新啓動不夠快或者類加載有問題,可採用重新加載技術。
4.排除加載資源
在開發中某些資源在更改時不一定需要觸發重新啓動,可使用自定義排除項,spring.devtools.restart.exclude屬性來排除。
如:spring.devtools.restart.exclude = static/**
如果要保留默認值然後添加排除項,可使用spring.devtools.restart.additional-exclude屬性。
5.添加附加路徑
當對不在類路徑中的文件進行更改時,可能需要重新啓動或重新加載應用程序。可在application配置文件中使用spring.devtools.restart.additional-paths屬性配置其它路徑來更改監視。
6.禁用重新啓動
如果不想使用重新啓動功能,可使用spring.devtools.restart.enabled屬性來禁用。
如:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
7.自定義重新啓動類加載器
如上述所講,重新啓動類功能通過使用兩個類加載器來實現的,對於大多數應用程序來說,該形式很好。
默認情況下,IDE或Eclipse中任何打開的項目都將使用“重新啓動”類加載器加載,如果在多模塊項目上工作,而不是將每個模塊都導入IDE或Eclipse中,則可能需要自定義事件。
可創建一個META-INF/spring-devtools.properties文件,該文件包含restart.exclude.和restart.include.前綴屬性。include表示放入到類加載器的項目(更改後不自動啓動),exclude表示不放入到類加載器的項目。
8.缺陷
重新啓動功能對使用標準反序列化的對象無效。