天天看點

spring boot 2進階篇(12)——熱交換Hot Swapping

spring boot 2進階篇(12)——熱交換Hot Swapping

熱交換

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/")
    }
}

// ...