Part III. Using Spring Boot
文檔說明:
- 文檔對(duì)應(yīng)的版本為 2.1.0.M3
- 這不是文檔的完整中文翻譯丈秩,也有可能跟原文文字不一一對(duì)應(yīng)盯捌,只是我閱讀文檔時(shí)候做的簡(jiǎn)單筆記
- 如果對(duì)應(yīng)的章節(jié)沒有任何中文,有可能是文檔內(nèi)容比較少蘑秽,建議直接看原文饺著,或者是我不感興趣的部分
- 目錄標(biāo)題沒有做翻譯,首先標(biāo)題一般一眼就能看懂什么意思肠牲,不做翻譯還能保證原文意思幼衰,其次也方便對(duì)應(yīng)到原文位置
這個(gè)篇章主要介紹 Spring Boot 更詳細(xì)的特性,包括構(gòu)建系統(tǒng)埂材,自動(dòng)配置和部署塑顺,最后介紹一些最佳實(shí)踐。
13. Build Systems
強(qiáng)烈建議使用構(gòu)建工具:Maven 或者 Gradle
13.1 Dependency Management
每個(gè) Spring Boot 的發(fā)行版本都會(huì)提供一個(gè)可支持的依賴列表。在實(shí)際處理依賴的時(shí)候严拒,你不需要提供版本號(hào)扬绪,版本號(hào)也由 Spring Boot 管理了。當(dāng)你更新了 Spring Boot 的版本裤唠,相關(guān)的依賴也會(huì)更新對(duì)應(yīng)的版本挤牛。
你仍然可以覆蓋 Spring Boot 的推薦版本來實(shí)現(xiàn)依賴指定的版本,但是 Spring Framework 的版本號(hào)就不要隨意更改了种蘸。
13.2 Maven
如果 Maven 用戶配置依賴了 spring-boot-starter-parent 項(xiàng)目墓赴,那么會(huì)繼承其默認(rèn)約束:
- Java 1.8 的編譯器
- UTF-8 源代碼文件的編碼格式
- 一個(gè)依賴管理的片段:管理各依賴版本的默認(rèn)配置
- repackage 的 Maven 任務(wù)
- 智能的 resource 過濾
- 智能的插件配置
- 智能地處理多環(huán)境的配置文件:例如 application-dev.properties 和 applicaton-dev.yml
13.2.1 Inheriting the Starter Parent
配置 pom.xml 時(shí)候,Spring Boot 需要指定版本航瞭,如果是其他的 starter 和依賴诫硕,則可以忽略版本號(hào)。
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.M3</version>
</parent>
[Spring Boot dependencies pom][spring-boot-dependencies-pom] 支持的屬性配置和依賴的默認(rèn)版本查看
13.2.2 Using Spring Boot without the Parent POM
并不是每個(gè)人都喜歡繼承 spring-boot-starter-parent POM刊侯,或者你已經(jīng)有自己的 parent POM章办,這種情況你需要顯示配置你的 Maven 配置。
在不繼承 spring-boot-starter-parent POM 的情況下滨彻,你可以通過 scope=import 依賴來獲取 Spring Boot 的依賴管理藕届。
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.M3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
上面例子里面,如果你在 dependency 下面繼續(xù)添加你的個(gè)人依賴亭饵,你配置的版本號(hào)是不會(huì)生效的休偶。為了達(dá)到自己配置第三方庫版本號(hào)的效果,你需要在配置 spring-boot-dependencies 之前就配置好第三方庫版本辜羊。例如踏兜,指定 Spring Data release train 庫的版本號(hào)如下所示:
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.M3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
13.2.3 Using the Spring Boot Maven Plugin
Spring Boot 提供了一個(gè)打包成可執(zhí)行的 jar 包的 Maven 插件,無論你是否繼承 spring-boot-starter-parent只冻,都需要添加如下配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
13.3 Gradle
詳情可查看《Spring Boot Gradle Plugin Reference Guide》文檔
Spring Boot 還寫了一個(gè) jar 包庇麦,詳情可查看其 API
13.4 Ant
可以通過 Apache Ant 和 Lvy 來構(gòu)建 Spring Boot 項(xiàng)目。spring-boot-antlib 也可以幫助 Ant 來構(gòu)建出可執(zhí)行的 jar喜德。
13.5 Starters
Startes 是依賴的描述器,代表了一組依賴垮媒,使用的時(shí)候非常方便舍悯。通過 Starters,你可以得到 SPring 和其相關(guān)技術(shù)的一站式服務(wù)睡雇,而不需要自己翻閱代碼和配置詳細(xì)的依賴萌衬。例如你想使用 Spring 和 JPA 來實(shí)現(xiàn)數(shù)據(jù)庫訪問,只需要配置 spring-boot-starter-data-jpa 依賴即可它抱。
Spring Boot Starters 的官方命名都有一定的格式 spring-boot-starter-*
秕豫,這可以和 IDE 的自動(dòng)補(bǔ)全結(jié)合,方便開發(fā)者編碼。由于你可以創(chuàng)建自己的 Starter祠墅,你的 Starter 名稱建議命名的時(shí)候項(xiàng)目名稱放在前面,例如 yourproject-spring-boot-starter歌径。
org.springframework.boot 可配置的 Starters 列表毁嗦。
其他社區(qū)貢獻(xiàn)的 Starters 可以參看 GitHub 的 README file。
14. Structuring Your Code
運(yùn)行 Spring Boot 不需要特定的代碼結(jié)構(gòu)回铛,然而狗准,有些組織代碼的建議。
14.1 Using the "default" Package
你的所有類都建議放到一個(gè)特定的 package 里面茵肃,沒有指定 package 的類會(huì)歸置到 default package腔长,這會(huì)在使用 @Component,@EntityScan验残,@SpringBootApplication 的時(shí)候會(huì)觸發(fā)一些問題捞附。
14.2 Locating the Main Application Class
我們一般建議你把啟動(dòng)類放在 package 的根目錄,啟動(dòng)類一般是帶有 main() 方法和 @SpringBootApplication 修飾的類胚膊。
如果不想使用 @SpringBootApplication故俐,可以用 @EnableAutoConfiguration 和 @ComponentScan 來替代。
下面是一個(gè)代碼結(jié)構(gòu)的例子
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
15. Configuration Classes
Spring Boot 偏向于使用 Java-based 配置紊婉。雖然有可能在使用 SpringApplication 的過程中使用 XML 配置药版,但是我們一般建議你的主配置類是單獨(dú)的 @Configuration 類。通常來說喻犁,這個(gè)主配置類一般還會(huì)定義 main 方法槽片。
Tip:很多已經(jīng)發(fā)布到網(wǎng)上的 Spring 應(yīng)用例子都是使用 XML 配置的,如果可以的話肢础,盡量使用對(duì)應(yīng)的 Java-based 配置还栓。可以嘗試查找 Enable* 的注解传轰。
15.1 Importing Additional Configuration Classes
你沒有必要把所有的 @Configuration 都放到一個(gè)類里面剩盒,通過 @Import 可以引入其他的 @Configuration 類】埽或者辽聊,你也可以使用 @ComponentScan 來自動(dòng)掃描所有 Spring 組件,包括 @Configuration 類期贫。
15.2 Importing XML Configuration
如果你一定要使用 XML 配置跟匆,我們建議你的主配置類還是 @Configuration 類,然后通過 @ImportResource 注解來加載 XML 配置文件通砍。
16. Auto-configuration
Spring Boot 自動(dòng)裝配會(huì)根據(jù)你應(yīng)用的 jar 依賴來自動(dòng)配置你的 Spring 應(yīng)用玛臂。例如,如果 HSQLDB 在 classpath 上,而你還沒有手動(dòng)配置任何的數(shù)據(jù)庫連接類迹冤,那么 Spring Boot 會(huì)自動(dòng)裝配一個(gè)嵌入式的數(shù)據(jù)庫讽营。
你需要選擇是否需要這個(gè)自動(dòng)裝配功能,在你其中的一個(gè) @Configuration 類是否添加 @EnableAutoConfiguration 或者 @SpringBootApplication 注解叁巨。
16.1 Gradually Replacing Auto-configuration
Auto-configuration 是非侵入性的斑匪。在任何時(shí)候,你可以定義自己的配置來替代 auto-configuration 的特定配置锋勺。例如蚀瘸,你添加了自己的 DataSource bean,那么默認(rèn)的嵌入式數(shù)據(jù)庫就不會(huì)再啟用庶橱。
如果你需要了解 auto-configuration 都做了哪些默認(rèn)配置贮勃,你可以在啟動(dòng)應(yīng)用的時(shí)候加上 --debug 參數(shù),這樣就可以在日志或者控制臺(tái)上查看了苏章。
16.2 Disabling Specific Auto-configuration Classes
如果你不想使用某個(gè) auto-configuration 類寂嘉,可以在 @EnableAutoConfiguration 注解添加 exclude 屬性來禁用這個(gè)類,代碼示例如下:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
如果這個(gè)類不在 classpath 上枫绅,可以配置其 excludeName 屬性泉孩,內(nèi)容就填寫這個(gè)類的完整類名。最后并淋,你還可以通過 spring.autoconfigure.exclude 配置項(xiàng)來配置一個(gè)禁用類的列表寓搬。
17. Spring Beans and Dependency Injection
你可以使用任意 Spring 的特性來定義你的 beans 和它們的注入依賴。為簡(jiǎn)單起見县耽,我們經(jīng)常發(fā)現(xiàn)使用 @ComponentScan 和 @Atuowired 都沒有問題句喷。
如果你的代碼如上面建議一樣,可以在根目錄找到主配置類兔毙,你在添加 @ComponentScan 的時(shí)候可以不用設(shè)置參數(shù)捌年。你應(yīng)用的所有組件 (@Component,
@Service, @Repository, @Controller etc.) 都會(huì)被自動(dòng)注冊(cè)為 Spring Beans剔难。
給個(gè) @Service 的例子:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
如果你的類只有一個(gè)構(gòu)造方法,你還可以省略 @Autowired 注解镶殷,如下所示:
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
18. Using the @SpringBootApplication Annotation
很多 Spring Boot 開發(fā)者都愿意他們的應(yīng)用使用到自動(dòng)裝配谷丸,組件掃描和定義更多額外的屬性龄坪。一個(gè) @SpringBootApplication 注解可以被用來啟用這三個(gè)特性:
- @EnableAutoConfiguration:?jiǎn)⒂?Spring Boot 的自動(dòng)裝配機(jī)制
- @ComponentScan:?jiǎn)⒂媒M件掃描
- @Configuration:允許在 context 注冊(cè) bean 或者引入額外的配置類
這個(gè) @SpringBootApplication 注解就等于 @Configuration, @EnableAutoConfiguration 和 @ComponentScan 注解的效果放棒,如下所示:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication 也提供了別名來配置 @EnableAutoConfiguration 和 @ComponentScan 相關(guān)的屬性章蚣。
這些特性都不是強(qiáng)制需要配置的,你可以其他相同功能的注解來替換 @SpringBootApplication 注解來實(shí)現(xiàn)你的需求蜻懦。例如,你不想要組件掃描的功能夕晓,代碼如下:
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
19. Running Your Application
把你的應(yīng)用打包成 jar 和內(nèi)嵌的 HTTP 服務(wù)宛乃,其中一個(gè)最大的好處就是你可以很方便地運(yùn)行你的應(yīng)用,而不需要特殊的 IDE 或其他插件。
當(dāng)然征炼,你也可以打包成 war 文件析既,你需要查閱其他的文檔。
19.1 Running from an IDE
找到 "Run as a Java Application" 的菜單并選擇執(zhí)行
19.2 Running as a Packaged Application
如果你有使用 Maven 或者 Gradle 構(gòu)建工具生成了一個(gè)可執(zhí)行的 jar 文件谆奥,你可以通過 java -jar 來運(yùn)行應(yīng)用眼坏。
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
也可以啟用遠(yuǎn)程調(diào)試
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myapplication-0.0.1-SNAPSHOT.jar
19.3 Using the Maven Plugin
Spring Boot Maven 插件包含了一個(gè) run 程序,用來快速編譯和運(yùn)行你的應(yīng)用酸些。
$ mvn spring-boot:run
你也可以使用 MAVEN_OPTS 來操作系統(tǒng)環(huán)境變量
$ export MAVEN_OPTS=-Xmx1024m
19.4 Using the Gradle Plugin
Spring Boot Gradle 插件包含了一個(gè) bootRun 程序宰译。
$ gradle bootRun
你也可以使用 JAVA_OPTS 來操作系統(tǒng)環(huán)境變量
$ export JAVA_OPTS=-Xmx1024m
19.5 Hot Swapping
由于 Spring Boot 應(yīng)用只是普通的Java應(yīng)用程序,所以 JVM Hot Swapping 可以實(shí)現(xiàn)魄懂。JVM Hot Swapping 在某種程度上只能做到替換字節(jié)碼文件沿侈,如果需要一個(gè)完整的解決方案,可以參考一下 JRebel市栗。
spring-boot-devtools 模塊也提供了一些可以快速重啟應(yīng)用的支持缀拭,可以查看 Chapter 20,或者 Chapter 89 的 Hot Swapping填帽。
20. Developer Tools
Spring Boot 提供了一個(gè)可以用來提升應(yīng)用開發(fā)體驗(yàn)的工具集 spring-boot-devtools蛛淋,這個(gè)工具集默認(rèn)是不啟用的,有需要可以添加如下配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
20.1 Property Defaults
緩存在生產(chǎn)環(huán)境是很有用的篡腌,但是在開發(fā)環(huán)境卻相反褐荷,因?yàn)槟阌锌赡懿荒芗皶r(shí)看到你修改代碼后的效果,所以 spring-boot-devtools 默認(rèn)不啟用緩存哀蘑。
可以配置 application.properties 的 spring.thymeleaf.cache 項(xiàng)來控制緩存诚卸。
spring.http.log-request-details:可以記錄請(qǐng)求內(nèi)容,處理的控制器和響應(yīng)內(nèi)容绘迁。
spring.devtools.addproperties:取消 DevTools 的默認(rèn)配置合溺。
更多默認(rèn)的屬性可以參看 DevToolsPropertyDefaultsPostProcessor
20.2 Automatic Restart
當(dāng) classpath 上面的文件發(fā)生改動(dòng)時(shí),DevTools 會(huì)自動(dòng)重啟應(yīng)用缀台。一般情況下棠赛,這對(duì)于快速獲取反饋很有幫助。
DevTools 會(huì)監(jiān)控 classpath 所有的資源文件膛腐,保存一個(gè)類文件或者在IDE操作 Build Project 都會(huì)觸發(fā) restart睛约。
DevTools 和 LiveReload 搭配使用效果更好,LiveReload 在 20.3 節(jié)有詳細(xì)介紹哲身。如果有使用 JRebel辩涝,自動(dòng)重啟機(jī)制會(huì)不啟用,DevTools 的其他功能勘天,例如 LiveReload 和 property default 仍會(huì)生效怔揩。
DevTools 在重啟應(yīng)用的時(shí)候是通過 ApplicationContext's shutdown hook 來實(shí)現(xiàn)關(guān)閉應(yīng)用捉邢,如果你有 SpringApplication.setRegisterShutdownHook(false)
的代碼,重啟機(jī)制會(huì)運(yùn)行異常商膊。
Restart vs Reload
Restart 機(jī)制是由 Spring Boot 通過兩個(gè) ClassLoader 來實(shí)現(xiàn)的伏伐,不需要依賴其他的組件。一些不會(huì)改動(dòng)的類晕拆,例如第三庫的 jars藐翎,會(huì)被加載到 Base ClassLoader。那些你正在開發(fā)的代碼類文件实幕,會(huì)被加載到 Restart ClassLoader吝镣。當(dāng)觸發(fā) Restart 時(shí),Restart ClassLoader 會(huì)被重新創(chuàng)建茬缩,Base ClassLoader 不做改動(dòng)赤惊。這個(gè)機(jī)制會(huì)讓其 Restart 操作比冷啟動(dòng)會(huì)快很多。
如果你覺得上面的機(jī)制還是不夠快凰锡,你可以借助其他組件(例如 JRebel)來實(shí)現(xiàn) Reload未舟。替換其對(duì)應(yīng)的 class 字節(jié)碼文件來實(shí)現(xiàn)。
20.2.1 Logging changes in condition evaluation
每次重啟后掂为,DevTools 默認(rèn)會(huì)記錄增量變化的報(bào)告裕膀,可通過下面的配置項(xiàng)來禁用
spring.devtools.restart.log-condition-evaluation-delta=false
20.2.2 Excluding Resources
想對(duì)某些文件修改后不觸發(fā)重啟操作,可以參看下面的配置
# 修改靜態(tài)文件的默認(rèn)配置
spring.devtools.restart.exclude=static/**,public/**
# 在原有的基礎(chǔ)上增加例外文件的配置
spring.devtools.restart.additional-exclude=filePath*
20.2.3 Watching Additional Paths
配置 spring.devtools.restart.additionalpaths 項(xiàng)
一般會(huì)和 spring.devtools.restart.exclude 配置項(xiàng)搭配使用
20.2.4 Disabling Restart
配置 spring.devtools.restart.enabled 項(xiàng)來不啟用重啟機(jī)制勇哗,這種情況下昼扛,Restart ClassLoader 還是會(huì)被初始化,只是他不會(huì)在監(jiān)控任何文件的改動(dòng)欲诺。
如果想完全禁用重啟機(jī)制抄谐,那么在調(diào)用 SpringApplication.run() 方法前設(shè)置其變量為 false。
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
20.2.5 Using a Trigger File
你經(jīng)常使用 IDE 來編碼扰法,可能更希望在特定的時(shí)機(jī)重啟蛹含,可以通過監(jiān)控一個(gè)特殊文件來實(shí)現(xiàn)。
配置 spring.devtools.restart.trigger-file 項(xiàng)
20.2.6 Customizing the Restart Classloader
上面的章節(jié)有描述 Restart ClassLoader 和 Base ClassLoader塞颁,正常情況下浦箱,你在 IDE 的代碼都會(huì)被加載到 Restart ClassLoader,如果你在 IDE 里面有多個(gè)模塊祠锣,而有些模塊是不經(jīng)常改動(dòng)酷窥,那么你可以通過添加 META-INF/spring-devtools.properties 文件來配置特殊的邏輯。
spring-devtools.properties 文件的配置內(nèi)容都必須以 restart.exclude 或者 restart.include 開頭伴网,restart.exclude 表示加載到 Base ClassLoader蓬推,restart.exclude 表示加載到 Restart ClassLoader。
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
20.2.7 Known Limitations
重啟功能在某些場(chǎng)景下運(yùn)行不是很好澡腾,例如在用 ObjectInputStream 做對(duì)象轉(zhuǎn)換的時(shí)候拳氢。
20.3 LiveReload
spring-boot-devtools 模塊有一個(gè)嵌入式的 LiveReload 服務(wù)募逞,這個(gè)服務(wù)可以用來在資源文件改變后觸發(fā)瀏覽器刷新頁面。LiveReload 瀏覽器插件可以從 livereload.com 獲取馋评,支持 Chrome,F(xiàn)irefox 和 Safari刺啦。
如果不想啟用 LiveReload 服務(wù)留特,把 spring.devtools.livereload.enabled 屬性配置為 false 即可。
同一時(shí)間你只能運(yùn)行一個(gè) LiveReload 服務(wù)玛瘸,所以在啟動(dòng)你的應(yīng)用之前蜕青,確認(rèn)是否有其他的 LiveReload 服務(wù)在運(yùn)行。如果你在 IDE 啟動(dòng)多個(gè)應(yīng)用糊渊,只有第一個(gè)啟動(dòng)的應(yīng)用可以正常使用 LiveReload 服務(wù)右核。
20.4 Global Settings
在用戶目錄添加 ~/.spring-boot-devtools.properties
文件,里面的配置會(huì)對(duì)這臺(tái)機(jī)器上面所有的 Spring Boot 應(yīng)用都會(huì)生效渺绒。
20.5 Remote Applications
spring-boot-devtools 并不只是限制在本地使用贺喝,還有一些功能是針對(duì)遠(yuǎn)程應(yīng)用的。遠(yuǎn)程支持的功能是可選的宗兼,若要啟用這個(gè)功能躏鱼,依賴配置如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
還需要設(shè)置 spring.devtools.remote.secret 屬性,例如:
spring.devtools.remote.secret=mysecret
Warning: 啟用 spring-boot-devtools 的遠(yuǎn)程功能會(huì)有安全風(fēng)險(xiǎn)殷绍,生產(chǎn)環(huán)境不能開啟該功能染苛。
遠(yuǎn)程功能包含兩個(gè)部分:一個(gè)是接收連接的服務(wù)端和一個(gè)在你 IDE 運(yùn)行的客戶端。當(dāng) spring.devtools.remote.secret 屬性被設(shè)置有值的時(shí)候主到,服務(wù)端會(huì)自動(dòng)啟用該功能茶行,客戶端需要手動(dòng)啟動(dòng)。
20.5.1 Running the Remote Client Application
遠(yuǎn)程功能的客戶端就是被設(shè)計(jì)在 IDE 運(yùn)行的登钥。在客戶端畔师,你需要使用和遠(yuǎn)程項(xiàng)目相同的 classpath 來運(yùn)行org.springframework.boot.devtools.RemoteSpringApplication≌睿客戶端應(yīng)用唯一需要的參數(shù)就是它要連接遠(yuǎn)程項(xiàng)目的 URL茉唉。
例如,你在使用 Eclipse 或者 STS结执,有一個(gè)項(xiàng)目 my-app 度陆,部署到了 Cloud Foundry,那你需要進(jìn)行如下操作:
- Select Run Configurations… from the Run menu.
- Create a new Java Application “l(fā)aunch configuration”.
- Browse for the my-app project.
- Use org.springframework.boot.devtools.RemoteSpringApplication as the main class.
- Add https://myapp.cfapps.io to the Program arguments (or whatever your remote URL is).
一個(gè)運(yùn)行遠(yuǎn)程功能的客戶端啟動(dòng)日志大概如下:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: 2.1.0.M3
2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication :
spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/springboot-
samples/spring-boot-sample-devtools)
2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext :
Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup
date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The
connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer :
LiveReload server is running on port 35729
2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication :
Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)
Note: 因?yàn)榭蛻舳耸褂玫?classpath 和真正的應(yīng)用是一樣的献幔,所以它能直接讀取到應(yīng)用的屬性配置懂傀。這就是 spring.devtools.remote.secret 配置項(xiàng)如何被讀取并傳給服務(wù)端認(rèn)證的原理。
Tip: 建議使用 https 協(xié)議作為傳輸協(xié)議蜡感,那么傳輸內(nèi)容是加密的蹬蚁,所以密碼等信息就不會(huì)被攔截恃泪。
Tip: 如果你通過代理來訪問服務(wù)端,那么需要配置 spring.devtools.remote.proxy.host 和 spring.devtools.remote.proxy.port 這兩個(gè)屬性犀斋。
20.5.2 Remote Update
客戶端會(huì)監(jiān)控你應(yīng)用 classpath 的文件變化贝乎,這個(gè)本地重啟(20.2節(jié) Automatic Restart)的機(jī)制一樣。所有的文件更新都會(huì)推送到服務(wù)端叽粹,必要時(shí)會(huì)觸發(fā)重啟操作览效。這在云服務(wù)上迭代開發(fā)一個(gè)功能的場(chǎng)景下會(huì)非常有幫助,因?yàn)橥ǔ碚f虫几,服務(wù)端的更新和重啟會(huì)比全部重啟和循環(huán)部署快很多锤灿。
Note: 文件只有在客戶端運(yùn)行時(shí)才會(huì)被監(jiān)控,如果你在啟動(dòng)客戶端前修改的文件辆脸,這個(gè)變化便不會(huì)推送到服務(wù)端但校。
21. Packaging Your Application for Production
Executable jar 可以用來發(fā)布到生產(chǎn)環(huán)境。由于他們都自帶容器啡氢,所以非常適用于基于云平臺(tái)的部署状囱。
更多關(guān)于可用于生產(chǎn)的功能,可以考慮添加 spring-boot-actuator
庫空执,可參看文檔 Part V, “Spring Boot Actuator: Production-ready features” 浪箭。
22. What to Read Next
你現(xiàn)在應(yīng)該知道如何使用 Spring Boot 和應(yīng)該遵循的一些最佳實(shí)踐,可以繼續(xù)深入了解 Spring Boot 特定的功能辨绊,或者你跳過這部分去了解關(guān)于生產(chǎn)部署方面的功能奶栖。