熱交換
Spring Boot支援熱交換Hot Swapping。本節回答有關它如何工作的問題。
重新加載靜态内容
Spring Boot有很多用于熱加載的選項,不過推薦使用spring-boot-devtools,因為它提供了其他開發時特性,比如快速應用重新開機和LiveReload,還有開發時敏感的配置加載(比如,模闆緩存)。
此外,使用IDE開發也是一個不錯的方式,特别是需要調試的時候(所有的現代IDEs都允許重新加載靜态資源,通常也支援對變更的Java類進行熱交換)。
最後,Maven和Gradle插件也支援指令行下的靜态檔案熱加載。如果你使用其他進階工具編寫css/js,并使用外部的css/js編譯器,那你就可以充分利用該功能。
在不重新開機容器的情況下重新加載模闆
Spring Boot支援的大多數模闆技術包含一個禁用緩存的配置選項,如果你正在使用spring-boot-devtools子產品,Spring Boot在開發期間會自動為你配置那些屬性。
Thymeleaf模闆
如果你正在使用Thymeleaf,那就将spring.thymeleaf.cache設定為false,檢視ThymeleafAutoConfiguration可以擷取其他Thymeleaf自定義選項。
FreeMarker模闆
如果你正在使用FreeMarker,那就将spring.freemarker.cache設定為false,檢視FreeMarkerAutoConfiguration 可以擷取其他FreeMarker自定義選項。
Groovy模闆
如果你正在使用Groovy模闆,那就将spring.groovy.template.cache設定為false,檢視GroovyTemplateAutoConfiguration可以擷取其他Groovy自定義選項。
Velocity模闆
如果你正在使用Velocity,那就将spring.velocity.cache設定為false,檢視VelocityAutoConfiguration可以擷取其他Velocity自定義選項。
應用快速重新開機
spring-boot-devtools子產品包括應用自動重新開機支援,雖然沒有其他技術快,比如JRebel或Spring Loaded,但比"冷啟動"快。在研究其他複雜重新開機選項時,你最好自己先試下,更多詳情可參考Spring Boot的使用:開發者工具章節。
在不重新開機容器的情況下重新加載Java類
現代IDEs(Eclipse, IDEA等)都支援位元組碼的熱交換,是以如果你做了一個沒有影響類或方法簽名的改變,它會利索地重新加載并沒有任何影響。
Spring Loaded在這方面走的更遠,它能夠重新加載方法簽名改變的類定義,如果對它進行一些自定義配置可以強制ApplicationContext重新整理自己(但沒有通用的機制來確定這對一個運作中的應用總是安全的,是以它可能隻是一個開發時的技巧)。
使用Maven配置Spring Loaded
為了在Maven指令行下使用Spring Loaded,你隻需将它作為依賴添加到Spring Boot插件聲明中即可,比如:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.0.RELEASE</version>
</dependency>
</dependencies>
</plugin>
正常情況下,這在Eclipse和IntelliJ IDEA中工作的相當漂亮,隻要它們有相應的,和Maven預設一緻的建構配置(Eclipse m2e對此支援的更好,開箱即用)。
使用Gradle和IntelliJ IDEA配置Spring Loaded
如果想将Spring Loaded和Gradle,IntelliJ IDEA結合起來,那你需要付出代價。預設情況下,IntelliJ IDEA将類編譯到一個跟Gradle不同的位置,這會導緻Spring Loaded監控失敗。
為了正确配置IntelliJ IDEA,你可以使用idea Gradle插件:
buildscript {
repositories { jcenter() }
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.4.1.RELEASE"
classpath 'org.springframework:springloaded:1.2.0.RELEASE'
}
}
apply plugin: 'idea'
idea {
module {
inheritOutputDirs = false
outputDir = file("$buildDir/classes/main/")
}
}
// ...