Spring Boot 2.2.2.RELEASE版本中文文檔持續更新中~如有需要獲取參考文檔文件,關注公眾號JavaSo,回復“參考文檔”即可。
3.2 結構化代碼
Spring Boot不需要任何特定的代碼布局即可工作。但是,有一些最佳做法會有所幫助。
3.2.1 使用“default”包
當一個類不包含引入包聲明時,將其視為在默認包中。通常不建議使用默認包,應避免這種情況。對於使用@ ComponentScan,@ ConfigurationPropertiesScan,@ EntityScan或@SpringBootApplication注解的Spring Boot應用程序,這可能會導致特定的問題,因為每個jar中的每個類都會被讀取。
Tip: 我們建議您遵循Java建議的程序包命名約定,並使用反向域名(例如com.example.project)。
3.2.2 放置應用程序主類
我們通常建議您將應用程序主類放在其他類之上的根包中。@SpringBootApplication注解通常放在您的主類上,它隱式定義某些項目的基本的“包搜索”。例如,如果您正在編寫JPA應用程序,則使用@SpringBootApplication注解的類的包來搜索@Entity。使用根軟件包還允許組件掃描僅應用於您的項目。使用根軟件包還允許組件掃描僅應用於您的項目。
Tips: 如果您不想使用@SpringBootApplication,則可以通過導入的@EnableAutoConfiguration和@ComponentScan注解來定義該行為,因此也可以替代使用。
以下清單顯示了典型的布局:
com +- example +- myapplication +- Application.java | +- customer | +- Customer.java | +- CustomerController.java | +- CustomerService.java | +- CustomerRepository.java | +- order +- Order.java +- OrderController.java +- OrderService.java +- OrderRepository.java
Application.java文件將聲明main方法以及基本的@SpringBootApplication,如下所示:
1 package com.example.myapplication; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 6 @SpringBootApplication 7 public class Application { 8 9 public static void main(String[] args) { 10 SpringApplication.run(Application.class, args); 11 } 12 13 }
3.3 配置類
Spring Boot支持基於Java的配置。盡管可以將SpringApplication與XML源一起使用,但是我們通常建議您的主要源為單個@Configuration類。通常,定義main方法的類是首選的@Configuration。
Tips: 在Internet上已經發布了許多使用XML配置的Spring配置示例。如果可能,請始終嘗試使用等效的基於Java的配置。搜索 Enable* 注解可能是一個不錯的起點。
3.3.1 導入其他配置類
您無需將所有@Configuration放在單個類中。@Import注解可用於導入其他配置類。另外,您可以使用@ComponentScan自動掃描所有Spring組件,包括@Configuration類。
3.3.2 導入XML配置
如果確定必須使用基於XML的配置,我們建議您仍然從@Configuration類開始。然后,您可以使用@ImportResource注解來加載XML配置文件。
3.4 自動配置
Spring Boot自動配置會嘗試根據添加的jar依賴項自動配置Spring應用程序。例如,如果HSQLDB在類路徑上,並且您尚未手動配置任何數據庫連接bean,則Spring Boot會自動配置內存數據庫。
您需要將@EnableAutoConfiguration或@SpringBootApplication注解其中之一添加到您的@Configuration類來選擇加入自動配置。
Tips: 您應該只@SpringBootApplication或@EnableAutoConfiguration注解的其中一個。我們通常建議您僅將另一個添加到您的主要@Configuration類中。
3.4.1 逐漸取代自動配置
自動配置是非侵入性的。在任何時候,您都可以開始定義自己的配置,以替換自動配置的特定部分。例如,如果您添加自己的DataSource bean,則默認的嵌入式數據庫會失效[ support backs away]。
如果您需要了解當前正在應用哪些自動配置以及原因,請使用--debug開關啟動您的應用程序。這樣做可以啟用調試日志以供選擇核心記錄器,並將條件報告記錄到控制台。
3.4.2 禁用特定的自動配置類
如果發現不需要的特定自動配置類,則可以使用@EnableAutoConfiguration的exclude屬性禁用它們,如以下示例所示:
1 import org.springframework.boot.autoconfigure.*; 2 import org.springframework.boot.autoconfigure.jdbc.*; 3 import org.springframework.context.annotation.*; 4 5 @Configuration(proxyBeanMethods = false) 6 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 7 public class MyConfiguration { 8 }
如果該類不在類路徑中,則可以使用注解的excludeName屬性,並指定完全限定名稱(com.example.project.ExampleConfiguration)。最后,您還可以使用spring.autoconfigure.exclude屬性控制要排除的自動配置類的列表。
Tips: 在注解級別和使用屬性均可以來定義排除項。
Note: 即使自動配置類是公共的,該類的唯一被認為是公共API的方面是可用於禁用自動配置的類的名稱。這些類的實際內容(例如嵌套配置類或Bean方法)僅供內部使用,我們不建議直接使用它們。
Spring beans和依賴注入
您可以自由使用任何標准的Spring Framework技術來定義bean及其注入的依賴關系。為簡單起見,我們發現使用@ComponentScan(組件掃描,查找您的bean)和使用@Autowired(進行構造函數注入)效果很好。
如果按照上面的建議構造代碼(將應用程序主類放在根包中),則可以使用@ComponentScan而不添加任何參數。您的所有應用程序組件(@Component,@Service,@Repository,@Controller等)都將自動注冊為Spring Bean。
以下示例顯示了一個@Service Bean,它使用構造函數注入來獲取所需的RiskAssessor Bean:
1 package com.example.service; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 6 @Service 7 public class DatabaseAccountService implements AccountService { 8 9 private final RiskAssessor riskAssessor; 10 11 @Autowired 12 public DatabaseAccountService(RiskAssessor riskAssessor) { 13 this.riskAssessor = riskAssessor; 14 } 15 16 // ... 17 18 }
如果bean具有一個構造函數,則可以省略@Autowired,如以下示例所示:
1 @Service 2 public class DatabaseAccountService implements AccountService { 3 4 private final RiskAssessor riskAssessor; 5 6 public DatabaseAccountService(RiskAssessor riskAssessor) { 7 this.riskAssessor = riskAssessor; 8 } 9 10 // ... 11 12 }
Tips: 請注意,使用構造函數注入如何使riskAssessor字段被標記為final,指示其隨后無法更改。
3.6 使用@SpringBootApplication注解
許多Spring Boot開發人員喜歡他們的應用程序使用自動配置、組件掃描,並能夠在其“應用程序類”上定義額外的配置。單個@SpringBootApplication注解可用於啟用這三個功能,即: @EnableAutoConfiguration:啟用Spring Boot的自動配置機制。 @ComponentScan:對應用程序所在的軟件包啟用@Component掃描(請參閱最佳實踐)。 * @Configuration:允許在上下文中注冊額外的bean或導入其他配置類。
1 package com.example.myapplication; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 6 @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan 7 public class Application { 8 9 public static void main(String[] args) { 10 SpringApplication.run(Application.class, args); 11 } 12 13 }
Note: @SpringBootApplication還提供別名以自定義@EnableAutoConfiguration和@ComponentScan的屬性。
Note: 這些功能都不是強制性的,您可以選擇用它啟用的任何功能替換此單個注解。例如,您可能不想在應用程序中使用組件掃描或配置屬性掃描:
1 package com.example.myapplication; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.context.annotation.ComponentScan; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.context.annotation.Import; 7 8 @Configuration(proxyBeanMethods = false) 9 @EnableAutoConfiguration 10 @Import({ MyConfig.class, MyAnotherConfig.class }) 11 public class Application { 12 13 public static void main(String[] args) { 14 SpringApplication.run(Application.class, args); 15 } 16 17 }在此示例中,除了沒有自動檢測到@Component注解的類和@ConfigurationProperties注解的類並且顯式導入了用戶定義的Bean外,Application就像其他任何Spring Boot應用程序一樣(請參閱@Import)。
3.7 運行您的應用程序
將應用程序打包為jar並使用嵌入式HTTP服務器的最大優勢之一是,您可以像運行其他應用程序一樣運行應用程序。調試Spring Boot應用程序也很容易,您不需要任何特殊的IDE插件或擴展。
Note: 本節僅介紹基於打包為jar的運行方式。如果選擇將應用程序打包為war文件,則應參考服務器和IDE文檔。
3.7.1 從IDE運行
您可以像簡單的Java應用程序一樣,運行IDE中的Spring Boot應用程序。但是,您首先需要導入您的項目。導入步驟因您的IDE和構建系統而異,大多數IDE可以直接導入Maven項目。例如,Eclipse用戶可以從File菜單中選擇 Import… → Existing Maven Projects的方式導入Maven項目。
如果您不能直接將項目導入IDE,則可以使用構建插件生成IDE元數據。Maven包括用於Eclipse和IDEA的插件。Gradle提供了用於各種IDE的插件。
Tips: 如果不小心兩次運行Web應用程序,則會看到“端口已在使用中”錯誤。STS用戶可以使用“重新啟動”按鈕而不是“運行”按鈕來確保關閉任何現有實例。
3.7.2 作為打包的應用程序運行
如果使用Spring Boot Maven或Gradle插件創建可執行jar,則可以使用java -jar命令來運行應用程序,如以下示例所示:
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
也可以在啟用了遠程調試支持的情況下運行打包的應用程序。這樣做使您可以遠程調試打包的應用程序,如以下示例所示:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myapplication-0.0.1-SNAPSHOT.jar
3.7.3 使用Maven插件
Spring Boot Maven插件包含一個 run 目標,可用於快速編譯和運行您的應用程序。應用程序可以像在IDE中一樣運行。以下示例顯示了運行Spring Boot應用程序的典型Maven命令:
$ mvn spring-boot:run
您可能還想使用MAVEN_OPTS操作系統環境變量,如以下示例所示:
$ export MAVEN_OPTS=-Xmx1024m
3.7.4 使用Gradle插件
Spring Boot Gradle插件還包含一個 bootRun 任務.每當您應用org.springframework.boot和Java插件時,都會添加bootRun任務,並在以下示例中顯示:
$ gradle bootRun
您可能還想使用JAVA_OPTS操作系統環境變量,如以下示例所示:
$ export JAVA_OPTS=-Xmx1024m
3.7.5 熱交換
由於Spring Boot應用程序只是普通的Java應用程序,因此可以立即使用JVM的熱交換。JVM熱插拔在一定程度上受到它可以替換的字節碼的限制。對於更完整的解決方案,可以使用JRebel。
spring-boot-devtools模塊還包括對應用程序快速重啟的支持。有關詳細信息,請參見本章后面的“開發人員工具”部分和熱插拔“操作方法”(此為熱插拔操作方法的原文地址,翻譯正在進行中)。
3.8 開發者工具
Spring Boot包含一組額外的工具,這些工具可以使應用程序開發體驗更加愉快。spring-boot-devtools模塊可以包含在任何項目中,以提供開發階段額外的功能。要包括devtools支持,請將模塊依賴項添加到您的構建中,如以下Maven清單所示:
Maven:
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 <optional>true</optional> 6 </dependency> 7 </dependencies>
Note: 運行完全打包的應用程序時,將自動禁用開發人員工具。如果您的應用程序是從java -jar啟動的,或者是從特殊的類加載器啟動的,則將其視為“生產環境應用程序”。如果這不適用於您(即,如果您從容器中運行應用程序),請考慮排除devtools或設置-Dspring.devtools.restart.enabled = false系統屬性。
Tips: 在Maven中將依賴項標記為可選或在Gradle中使用自定義developmentOnly配置(如上所示)是一種最佳實踐,它可以防止將devtools過渡地應用到使用您項目的其他模塊。
Tips: 重新打包的存檔默認情況下不包含devtools。如果要使用某個遠程devtools功能,則需要禁用excludeDevtools構建屬性。Maven和Gradle插件均支持該屬性。
3.8.1 屬性默認值
Spring Boot支持的一些庫使用緩存來提高性能。例如,模板引擎(此為模板引擎的原文地址,翻譯正在進行中)緩存已編譯的模板,以避免重復解析模板文件。另外,Spring MVC可以在提供靜態資源時向響應添加HTTP緩存頭。
盡管緩存在生產中非常有益,但在開發過程中可能適得其反,從而使您無法看到剛剛在應用程序中所做的更改。因此,默認情況下,spring-boot-devtools禁用緩存選項。
緩存選項通常由application.properties文件中的設置配置。例如,Thymeleaf提供spring.thymeleaf.cache屬性。spring-boot-devtools模塊不需要自動設置這些屬性,而是自動應用合理的開發時配置。
由於在開發Spring MVC和Spring WebFlux應用程序時需要有關Web請求的更多信息,因此開發人員工具將為Web日志記錄組啟用DEBUG日志記錄。這將為您提供有關傳入請求、正在處理的處理程序、響應結果等信息。如果您希望記錄所有請求詳細信息(包括潛在的敏感信息),則可以打開 spring.http.log-request-details 配置屬性。
Note: 如果您不希望應用默認屬性,則可以在application.properties中將spring.devtools.add-properties設置為false。
Tips: 有關devtools應用的屬性的完整列表,請參見DevToolsPropertyDefaultsPostProcessor。
3.8.2 自動重啟
每當classpath上的文件更改時,使用spring-boot-devtools的應用程序都會自動重新啟動。在IDE中工作時,這可能是一個有用的功能,因為它為代碼更改提供了非常快速的反饋循環。默認情況下,將監視類路徑上指向文件夾的任何條目的更改。請注意,某些資源(例如靜態資產和視圖模板)不需要重新啟動應用程序(此為鏈接的原文地址,翻譯正在進行中)。
觸發重啟
當DevTools監視類路徑資源時,觸發重啟的唯一方法是更新類路徑。導致類路徑更新的方式取決於所使用的IDE。在Eclipse中,保存修改后的文件將導致類路徑被更新並觸發重新啟動。在IntelliJ IDEA中,構建項目(Build + → + Build Project)具有相同的效果。
Note: 只要啟用了forking,您還可以使用受支持的構建插件(Maven和Gradle)啟動應用程序,因為DevTools需要隔離的應用程序類加載器才能正常運行。默認情況下,Gradle和Maven插件會fork應用程序進程。
Tips: 與LiveReload一起使用時,自動重新啟動效果很好。有關詳細信息,請參見下文LiveReload部分。如果使用JRebel,則禁用自動重新啟動,而支持動態類重新加載。其他devtools功能(例如LiveReload和屬性替代)仍可以使用。
Tips: DevTools依賴於應用程序上下文的程序關閉鈎子。如果您禁用了關閉鈎子(SpringApplication.setRegisterShutdownHook(false)),它將無法正常工作。
Tips: 在確定類路徑上的條目是否應在更改后觸發重新啟動時,DevTools會自動忽略名為spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的項目。
Tips: DevTools需要自定義ApplicationContext使用的ResourceLoader。如果您的應用程序已經提供了,它將被包裝。不支持在ApplicationContext上直接重寫getResource方法。
重新啟動與重新加載
Spring Boot提供的重啟技術通過使用兩個類加載器來工作。不變的類(例如,來自第三方jar的類)將被加載到基類加載器中。您正在積極開發的類將加載到重新啟動類加載器中。重新啟動應用程序時,將丟棄重新啟動類加載器,並創建一個新的類加載器。這種方法意味着應用程序的重啟通常比“冷啟動”要快得多,因為基本類加載器已經可用並已填充。
如果發現重新啟動對於您的應用程序來說不夠快,或者遇到類加載問題,則可以考慮ZeroTurnaround重新加載技術,例如JRebel。這些方法通過在加載類時重寫類來使其更易於重新加載。
記錄條件評估中的更改[Logging changes in condition evaluation]
默認情況下,每次應用程序重新啟動時,都會記錄一個報告,其中顯示了條件評估增量。該報告顯示了您進行更改(例如添加或刪除Bean以及設置配置屬性)時對應用程序自動配置的更改。
要禁用報告的日志記錄,請設置以下屬性:
1 spring.devtools.restart.log-condition-evaluation-delta=false
資源排除
某些資源在更改時不一定需要觸發重新啟動。例如,Thymeleaf模板可以就地編輯。默認情況下,更改 /META-INF/maven,/META-INF/resources,/resources,/static,/public 或 /templates 中的資源不會觸發重新啟動,但會觸發實時重新加載。如果要自定義這些排除項,則可以使用spring.devtools.restart.exclude屬性。例如,要僅排除 /static和/public,可以設置以下屬性:
1 spring.devtools.restart.exclude=static/**,public/**
Tips: 如果要保留這些默認值並添加其他排除項,請改用spring.devtools.restart.additional-exclude屬性。
觀察其他路徑
當您對不在類路徑上的文件進行更改時,您可能希望重新啟動或重新加載應用程序。為此,請使用 spring.devtools.restart.additional-paths 屬性配置其他路徑以監視更改。您可以使用前面所述的 spring.devtools.restart.exclude 屬性來控制其他路徑下的更改是觸發完全重啟還是實時重新加載。
禁用重啟
如果您不想使用重新啟動功能,則可以使用spring.devtools.restart.enabled屬性將其禁用。在大多數情況下,您可以在application.properties中設置此屬性(這樣做仍會初始化重新啟動類加載器,但它不會監視文件更改)。
如果您需要完全禁用重啟支持(例如,因為它不適用於特定的庫),則需要在調用SpringApplication.run(...)之前將spring.devtools.restart.enabled系統屬性設置為false。如以下示例所示:
1 public static void main(String[] args) { 2 System.setProperty("spring.devtools.restart.enabled", "false"); 3 SpringApplication.run(MyApp.class, args); 4 }
使用觸發文件
如果使用持續編譯更改文件的IDE,則可能更喜歡僅在特定時間觸發重新啟動。為此,您可以使用“觸發文件”,這是一個特殊文件,當您要實際觸發重新啟動檢查時必須對其進行修改。
Note: 對文件的任何更新都將觸發檢查,但是只有在Devtools檢測到有事情要做的情況下,重啟才真正發生。
要使用觸發文件,請將spring.devtools.restart.trigger-file屬性設置為觸發文件的名稱(不包括任何路徑)。觸發文件必須出現在類路徑上的某個位置。
例如,如果您的項目具有以下結構:
src +- main +- resources +- .reloadtrigger
然后,您的觸發文件屬性將是:
1 spring.devtools.restart.trigger-file=.reloadtrigger
現在僅在src/main/resources/.reloadtrigger發生更改時才重啟。
Tips: 您可能需要將spring.devtools.restart.trigger-file設置為全局設置(后文),以便所有項目的行為均相同。
某些IDE具有使您不必手動更新觸發器文件的功能。Spring Tools for Eclipse和IntelliJ IDEA(旗艦版)都具有這種支持。使用Spring Tools,您可以從控制台視圖使用“重新加載”按鈕(只要您的觸發文件名為.reloadtrigger)。對於IntelliJ,您可以按照其文檔中的說明進行操作。
自定義重啟類加載器
如前面的“重新啟動與重新加載”部分所述,重新啟動功能是通過使用兩個類加載器實現的。對於大多數應用程序,此方法效果很好。但是,有時可能會導致類加載問題。
默認情況下,IDE中的任何打開的項目都使用“restart”類加載器加載,而任何常規的.jar文件都使用“base”類加載器加載。如果您在多模塊項目上工作,並且並非每個模塊都導入到IDE中,則可能需要自定義內容。為此,您可以創建一個 META-INF/spring-devtools.properties 文件。
spring-devtools.properties文件可以包含帶有restart.exclude和restart.include前綴的屬性。include元素是應上拉到“restart”類加載器中的項目,而exclude元素是應下推到“base”類加載器中的項目。該屬性的值是應用於類路徑的正則表達式模式,如以下示例所示:
1 restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\.]+\.jar 2 restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\.]+\.jar
Tips: 所有屬性鍵都必須是唯一的。只要屬性以restart.include. 或restart.exclude. 開頭。
Note: 將加載類路徑中的所有 META-INF/spring-devtools.properties 。您可以將文件打包到項目內部,也可以打包到項目使用的庫中。
已知局限性
重新啟動功能不適用於使用標准ObjectInputStream反序列化的對象。如果您需要反序列化數據,則可能需要將Spring的ConfigurableObjectInputStream與Thread.currentThread().getContextClassLoader()結合使用。
不幸的是,一些第三方庫在不考慮上下文類加載器的情況下反序列化。如果發現這樣的問題,則需要向原始作者請求修復。
LiveReload
spring-boot-devtools模塊包括一個嵌入式LiveReload服務器,該服務器可用於在更改資源時觸發瀏覽器刷新。可從livereload.com免費獲得適用於Chrome,Firefox和Safari的LiveReload瀏覽器擴展。
如果您不想在應用程序運行時啟動LiveReload服務器,則可以將spring.devtools.livereload.enabled屬性設置為false。
Note: 一次只能運行一台LiveReload服務器。在啟動應用程序之前,請確保沒有其他LiveReload服務器正在運行。如果從IDE啟動多個應用程序,則只有第一個具有LiveReload支持。
3.8.4 全局設置
您可以通過將以下任何文件添加到 $HOME/.config/spring-boot 文件夾來配置全局devtools設置: 1. spring-boot-devtools.properties 2. spring-boot-devtools.yaml 3. spring-boot-devtools.yml
添加到這些文件的任何屬性都將應用於使用devtools的計算機上的所有Spring Boot應用程序。例如,要將重新啟動配置為始終使用觸發文件,應添加以下屬性:
spring.devtools.restart.trigger-file=.reloadtrigger
如果在 $HOME/.config/spring-boot 中找不到devtools配置文件,則在 $HOME文件夾的根目錄中搜索是否存在.spring-boot-devtools.properties文件。這使您可以與不支持 $HOME /.config/spring-boot位置的較舊版本的Spring Boot上的應用程序共享devtools全局配置。
在上述文件中激活的配置文件不會影響特定於配置文件的配置文件的加載。
3.8.5 遠程應用
Spring Boot開發人員工具不僅限於本地開發 遠程運行應用程序時,您還可以使用多種功能。選擇啟用遠程支持,因為啟用它可能會帶來安全風險。僅當在受信任的網絡上運行或使用SSL保護時,才應啟用它。如果這兩個選項都不可用,則不應使用DevTools的遠程支持。您永遠不要在生產部署上啟用支持。
要啟用它,您需要確保在包中包含devtools,如以下清單所示:
1 <build> 2 <plugins> 3 <plugin> 4 <groupId>org.springframework.boot</groupId> 5 <artifactId>spring-boot-maven-plugin</artifactId> 6 <configuration> 7 <excludeDevtools>false</excludeDevtools> 8 </configuration> 9 </plugin> 10 </plugins> 11 </build>
然后,您需要設置spring.devtools.remote.secret屬性。像任何重要的密碼或機密一樣,該值應唯一且強壯,以免被猜測或強行使用。
遠程devtools支持分為兩部分:接受連接的服務器端端點和在IDE中運行的客戶端應用程序。設置spring.devtools.remote.secret屬性后,將自動啟用服務器組件。客戶端組件必須手動啟動。
運行遠程客戶端應用程序
遠程客戶端應用程序旨在在您的IDE中運行。您需要使用與您連接到的遠程項目相同的類路徑來運行org.springframework.boot.devtools.RemoteSpringApplication。該應用程序的唯一必需參數是它連接到的遠程URL。
例如,如果您使用的是Eclipse或STS,並且有一個名為my-app的項目已部署到Cloud Foundry,則可以執行以下操作: 從 Run 菜單中選擇 Run Configurations…。 創建一個新的 Java Application “launch configuration”。 瀏覽 my-app 項目。 使用 org.springframework.boot.devtools.RemoteSpringApplication 作為主類。 * 將https://myapp.cfapps.io添加到程序參數(或任何遠程URL)。
正在運行的遠程客戶端可能和如下類似:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: 2.2.2.RELEASE
2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-project/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code)
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: 因為遠程客戶端使用與真實應用程序相同的類路徑,所以它可以直接讀取應用程序屬性。這就是讀取spring.devtools.remote.secret屬性並將其傳遞給服務器進行身份驗證的方式。
Tips: 始終建議使用https//作為連接協議,以便對通信進行加密並且不能截獲密碼。
Tips: 如果需要使用代理來訪問遠程應用程序,請配置spring.devtools.remote.proxy.host和spring.devtools.remote.proxy.port屬性。
遠程更新
遠程客戶端以與本地重新啟動相同的方式監視應用程序類路徑中的更改。任何更新的資源都會推送到遠程應用程序,並且(如果需要)會觸發重新啟動。如果您迭代使用本地沒有的雲服務的功能,這將很有幫助。通常,遠程更新和重新啟動比完整的重建和部署周期快得多。
Note: 僅在遠程客戶端正在運行時監視文件。如果在啟動遠程客戶端之前更改文件,則不會將其推送到遠程服務器。
配置文件系統觀察器
FileSystemWatcher的工作方式是按一定的時間間隔輪詢類更改,然后等待預定義的靜默期以確保沒有更多更改。然后將更改上傳到遠程應用程序。在較慢的開發環境中,可能會發生靜默期不夠的情況,並且類中的更改可能會分為幾批。第一批類更改上傳后,服務器將重新啟動。由於服務器正在重新啟動,因此下一批不能發送到應用程序。
這通常通過RemoteSpringApplication日志中的警告來證明,即有關上載某些類失敗的消息,然后進行重試。但是,這也可能導致應用程序代碼不一致,並且在上傳第一批更改后無法重新啟動。
如果您經常觀察到此類問題,請嘗試將spring.devtools.restart.poll-interval和spring.devtools.restart.quiet-period參數增加到適合您的開發環境的值:
1 spring.devtools.restart.poll-interval=2s 2 spring.devtools.restart.quiet-period=1s
現在每2秒輪詢一次受監視的classpath文件夾以進行更改,並保持1秒鍾的靜默時間以確保沒有其他類更改。
3.9 打包您的生產應用
可執行jar可以用於生產部署。由於它們是獨立的,因此它們也非常適合基於雲的部署。
對於其他“Production ready”功能,例如運行狀況,審核和度量REST或JMX端點,請考慮添加spring-boot-actuator。有關詳細信息,請參見Spring Boot Actuator:Production-ready Features(此為鏈接的原文地址,翻譯正在進行中)。
3.10 接下來要讀什么
現在,您應該了解如何使用Spring Boot以及應遵循的一些最佳實踐。現在,您可以繼續深入了解特定的Spring Boot功能(此為鏈接的原文地址,翻譯正在進行中),或者可以跳過並閱讀有關Spring Boot的“production ready(此為鏈接的原文地址,翻譯正在進行中)”方面的信息。
Spring Boot 2.2.2.RELEASE版本中文文檔持續更新中~如有需要獲取參考文檔文件,關注公眾號JavaSo,回復“參考文檔”即可。