Part III. 使用Spring Boot

本節詳細介紹瞭如何使用Spring Boot。 它包含了構建系統,自動配置以及如何運行應用程序等主題。 我們還介紹了一些Spring Boot最佳實踐。 雖然Spring Boot沒有什麼特別之處(它只是你可以使用的另 一個庫),但是有一些建議,如果遵循這些建議,你的開發過程會更容易一些。

如果您剛開始使用Spring Boot,那麼在深入瞭解本節之前,您應該閱讀“入門指南 ”。

13. 構建系統

強烈建議您選擇支持依賴管理 且可以使用發佈到“Maven Central”存儲庫的工件的構建系統。我們建議 您選擇Maven或Gradle。 可以讓Spring Boot與其他構建系統(例如Ant)一起工作,但它們並沒有得到 特別好的支持。

13.1 依賴管理

每個版本的Spring Boot都提供了它支持的依賴項的精選列表。 實際上,您不需要爲構建配置中的任何 這些依賴項提供版本,因爲Spring Boot會爲您管理這些依賴項。 當您升級Spring Boot時,這些依賴項 也會以一致的方式升級。

注意事項

如果需要,您仍然可以指定版本並覆蓋Spring Boot的建議。

精選列表包含可以與Spring Boot一起使用的所有spring模塊以及精確的第三方庫列表。該列表可作爲標 準的材料清單 (spring-boot-dependencies) 提供,可與Maven 和 Gradle一起使用。

警告

每個版本的Spring Boot都與Spring Framework的基本版本相關聯。 我們強烈建議您不要指定其 
版本。

13.2 Maven

Maven用戶可以繼承 spring-boot-starter-parent 項目以獲得合理的默認值。 父項目提供以下 功能:

  • Java 1.8作爲默認編譯器版本。.
  • UTF-8源編碼。
  • 一個依賴管理部分, 從Spring Boot依賴繼承POM,管理公共依賴的版本。 此依賴關係管理允許您在 自己的pom中使用時省略這些依賴項的<version>標記。
  • 使用重新打包執行ID執行重新打包目標。
  • 合理的 資源過濾。
  • 合理的插件配置 (exec插件, Git中提交ID, 和 shade).
  • application.properties和application.yml的合理資源過濾,包括特定於配置文件的文件( 例 如, application-dev.properties 和 application-dev.yml)

請注意,由於application.properties和application.yml文件接受Spring樣式佔位符 (${…}), 因此Maven過濾更改爲使用 @..@ 佔位符。(您可以通過設置名爲 resource.delimiter的Maven屬 性來覆蓋它。)

繼承Starter Parent

要將項目配置爲從spring-boot-starter-parent繼承, 請按如下所示設置父項:

<!-- 繼承Spring Boot的默認值 -->
<parent>
 <groupId>org.springframework.boot</groupId> 
 <artifactId>spring-boot-starter-parent</artifactId> 
 <version>2.1.0.RELEASE</version>
</parent>

注意事項

您應該只需要在此依賴項上指定Spring Boot版本號。 如果導入其他啓動器,則可以安全地忽略 版本號。

通過該設置,您還可以通過覆蓋自己項目中的屬性來覆蓋單個依賴項。 例如,要升級到另一個Spring Data版本系列,您需要將以下內容添加到pom.xml:

<properties> 
 <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

提示

檢查spring-boot-dependencies pom以獲取支持的屬性列表。

在沒有父POM的情況下使用Spring Boot

不是每個人都喜歡從spring-boot-starter-parent POM繼承.  您可能擁有自己需要使用的公司 標準父級,或者您可能更願意明確聲明所有Maven配置。

如果您不想使用spring-boot-starter-parent, 您仍然可以通過使用 scope=import 依賴項來保 持依賴項管理(但不是插件管理)的好處,如下所示:

<dependencyManagement>
  <dependencies>
  <dependency>
   <!-- 從Spring Boot導入依賴關係管理 -->
   <groupId>org.springframework.boot</groupId> 
   <artifactId>spring-boot-dependencies</artifactId> 
   <version>2.1.0.RELEASE</version> 
   <type>pom</type>
   <scope>import</scope>
  </dependency>
 </dependencies>
</dependencyManagement>

如上所述,前面的示例設置不允許您使用屬性覆蓋單個依賴項。要獲得相同的結果, 您需要在 spring-boot-dependencies條目之前在項目的dependencyManagement中添加一個條目。 例如,要升級 到另一個Spring Data版本系列,可以將以下元素添加到pom.xml:

<dependencyManagement>
 <dependencies>
  <!-- 覆蓋Spring Boot提供的Spring Data版本系列 -->
  <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.RELEASE</version> 
   <type>pom</type>
   <scope>import</scope>
  </dependency>
 </dependencies>
</dependencyManagement>

注意事項

在前面的示例中,我們指定了BOM,但是可以以相同的方式覆蓋任何依賴關係類型。

使用Spring Boot Maven插件

Spring Boot包含一個Maven插件 可以將項目打包爲可執行jar。 如果要使用插件,請將插件添加 到<plugins> 部分,如以下示例所示:

<build>
 <plugins>
  <plugin> 
   <groupId>org.springframework.boot</groupId> 
   <artifactId>spring-boot-maven-plugin</artifactId> 
  </plugin>
 </plugins>
</build>

注意事項

如果您使用Spring Boot啓動程序父pom,則只需添加插件。 除非您要更改父級中定義的設置,否 則無需對其進行配置。

13.3 Gradle

要了解如何將Spring Boot與Gradle一起使用,請參閱Spring Boot的Gradle插件的文檔:

  • 參考 (HTML和PDF)
  • API

13.4 Ant

可以使用Apache Ant + Ivy構建Spring Boot項目。 spring-boot-antlib “AntLib” 模塊也可用於幫 助Ant創建可執行jar。
要聲明依賴項,典型的ivy.xml 文件看起來像下面的例子:

<ivy-module version="2.0">
 <info organisation="org.springframework.boot" module="spring-boot-sample-ant" /> 
 <configurations>
  <conf name="compile" description="everything needed to compile this module" />
  <conf name="runtime" extends="compile" description="everything needed to run this module" /> 
 </configurations>
 <dependencies>
  <dependency org="org.springframework.boot" name="spring-boot-starter" 
   rev="${spring-boot.version}" conf="compile" />
 </dependencies>
</ivy-module>

典型的build.xml類似於以下示例:

<project
 xmlns:ivy="antlib:org.apache.ivy.ant" 
 xmlns:spring-boot="antlib:org.springframework.boot.ant" 
 name="myapp" default="build">
 <property name="spring-boot.version" value="2.1.0.RELEASE" />
 <target name="resolve" description="--> retrieve dependencies with ivy"> 
  <ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" /> 
 </target>
 <target name="classpaths" depends="resolve"> 
  <path id="compile.classpath">
   <fileset dir="lib/compile" includes="*.jar" /> 
  </path>
 </target>
 <target name="init" depends="classpaths"> 
  <mkdir dir="build/classes" />
 </target>
 <target name="compile" depends="init" description="compile">
  <javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" /> 
 </target>
 <target name="build" depends="compile">
  <spring-boot:exejar destfile="build/myapp.jar" classes="build/classes"> 
   <spring-boot:lib>
    <fileset dir="lib/runtime" />
   </spring-boot:lib>
  </spring-boot:exejar>
 </target>
</project>

提示

如果您不想使用spring-boot-antlib 模塊, 請參見 91.9部分,“不使用spring-boot-antlib從Ant構建可執行文件”“操作方法”。

13.5 Starters

Starters 是一組方便的依賴關係描述符,您可以將其包含在應用程序中。 您可以獲得所需的所 有Spring和相關技術的一站式服務,而無需查看示例代碼和複製粘貼依賴描述符的負載。 例如,如果 要開始使用Spring和JPA進行數據庫訪問,請在項目中包含spring-boot-starter-data-jpa 依賴 項。

starters包含許多依賴項,這些依賴項是使項目快速啓動和運行所需的依賴項,以及一組受支持的託管 傳遞依賴項。

什麼是一個名稱

所有官方starters都遵循類似的命名模式;spring-boot-starter-*,其中*是指定類型的應用程 序。 此命名結構旨在幫助您找到啓動器.  許多IDE中的Maven集成允許您按名稱搜索依賴項。 例 如,安裝了適當的Eclipse或STS插件後,您可以在POM編輯器中按ctrl-space並輸入“spring-boot-starter”以獲取完整列表。

正如 “創建自己的入門” 一節中, 第三方啓動器不應該以spring-boot啓動, 因爲它是爲官 方Spring Boot工件保留的。  相反,第三方啓動器通常以項目名稱開頭。  例如,名 爲thirdpartyproject的第三方入門項目通常被命名爲thirdpartyproject-spring-boot-starter.

以下應用程序啓動程序由org.springframework.boot組下的Spring Boot提供:

表13.1。 Spring Boot應用程序啓動器

名稱 概述 pom
spring-boot-starter 核心啓動器,包括自動配置支 持,日誌記錄和YAML pom
spring-boot-starter-activemq 使用Apache ActiveMQ進 行JMS消息傳遞的啓動器 pom
spring-boot-starter-amqp 使用Spring AMQP和Rabbit MQ的啓動器 pom
spring-boot-starter-aop 使用Spring AOP進行面向切面 編程的啓動器和AspectJ pom
spring-boot-starter-artemis 使用Apache Artemis進 行JMS消息傳遞的啓動器 pom
spring-boot-starter-batch 使用Spring Batch的啓動器 pom
spring-boot-starter-cache 使用Spring Framework的緩 存支持的啓動器 pom
spring-boot-starter-cloud-connectors 使用Spring Cloud Connectors的啓動器簡化 了Cloud Foundry和Heroku等 雲平臺中的服務連接 pom
spring-boot-starter-data-cassandra 使用Cassandra分佈式數據庫 和Spring Data Cassandra的啓動器 pom
spring-boot-starter-
data-cassandra-reactive
使用Cassandra分佈式數據庫 和Spring Data Cassandra Reactive的啓動器 pom
spring-boot-starter-data-couchbase 使用Couchbase面向文檔的數 據庫和Spring Data Couchbase的啓動器 pom
spring-boot-starter-data-couchbase-reactive 使用Couchbase面向文檔的數 據庫和Spring Data Couchbase Reactive的啓動器 pom
spring-boot-starter-data-elasticsearch 使用Elasticsearch搜索和分析引 擎以及Spring Data Elasticsearch的啓動器 pom
spring-boot-starter-data-jdbc 使用Spring Data JDBC的啓動器 pom
spring-boot-starter-data-jpa 將Spring Data JPA與Hibernate一起 使用的啓動器 pom
spring-boot-starter-data-ldap 使用Spring Data LDAP的啓動器 pom
spring-boot-starter-data-mongodb 使用MongoDB面向文檔的數據 庫和Spring Data MongoDB的 啓動器 pom
spring-boot-starter-data-mongodb-reactive 使用MongoDB面向文檔的數 據庫和Spring Data MongoDB Reactive的啓動器 pom
spring-boot-starter-data-neo4j 使用Neo4j圖形數據庫和Spring Data Neo4j的啓動器 pom
spring-boot-starter-data-redis 與Spring Data Redis和Lettuce客 戶端一起使用Redis鍵值數據存儲 的啓動器 pom
spring-boot-starter-data-redis-reactive 使用Redis鍵值數據存儲 與Spring Data Redis被動 和Lettuce客戶端的啓動器 pom
spring-boot-starter-data-rest 使用Spring Data REST通 過REST公開Spring Data存儲 庫的啓動器 pom
spring-boot-starter-data-solr 使用Apache Solr搜索平臺和Spring Data Solr的啓動器 pom
spring-boot-starter-freemarker 使用FreeMarker視圖構建MVC Web應用程序的啓動器 pom
spring-boot-starter-groovy-templates 使用Groovy模板視圖構建MVC Web應用程序的啓動器 pom
spring-boot-starter-hateoas 使用Spring MVC和Spring構建基於超媒體的RESTful Web應用程序的啓動器
HATEOAS
pom
spring-boot-starter-integration 使用Spring Integration的啓動器 pom
spring-boot-starter-jdbc 將JDBC與HikariCP連接池一起使用的啓動器 pom
spring-boot-starter-jersey 使用JAX-RS和Jersey構建RESTful Web應用程序的啓動器。 替代
spring-boot-starter-web
pom
spring-boot-starter-jooq 使用jOOQ訪問SQL數據庫的啓動器。 替代 spring-boot-starter-data-jpa 或者
spring-boot-starter-jdbc
pom
spring-boot-starter-json 讀和寫json的啓動器 pom
spring-boot-starter-jta-atomikos 使用Atomikos進行JTA事務的啓動器 pom
spring-boot-starter-jta-bitronix 使用Bitronix進行JTA事務的啓動器 pom
spring-boot-starter-mail 使用Java Mail的啓動器和Spring Framework的電子郵件發送支持 pom
spring-boot-starter-mustache 使用Mustache視圖構建Web應用程序的啓動器 pom
spring-boot-starter-oauth2-client 使用Spring Security的OAuth2/OpenID連接客戶端功能的啓動器 pom
spring-boot-starter-oauth2-resource-server 使用Spring Security的OAuth2資源服務器功能的啓動器 pom
spring-boot-starter-quartz 使用Quartz調度程序的啓動器 pom
spring-boot-starter-security 使用Spring Security的啓動器 pom
spring-boot-starter-test 使用JUnit,Hamcrest和Mockito等庫來測試Spring Boot應用程序的啓動器 pom
spring-boot-starter-thymeleaf 使用Thymeleaf視圖構建MVC Web應用程序的啓動器 pom
spring-boot-starter-validation 使用Java Bean Validation和Hibernate Validator的啓動器 pom
spring-boot-starter-web 用於構建Web的啓動器,包括RESTful應用程序使用Spring MVC。 使用Tomcat作爲默認嵌入式容器 pom
spring-boot-starter-web-services 使用Spring Web Services的啓動器 pom
spring-boot-starter-webflux 使用Spring Framework的Reactive Web支持構建WebFlux應用程序的啓動器 pom
spring-boot-starter-websocket 使用Spring Framework的WebSocket支持構建WebSocket應用程序的啓動器 pom

除應用程序啓動器外,還可以使用以下啓動器添加 生產就緒  功能:

表13.2。 Spring Boot生產啓動器

名稱 描述 pom
spring-boot-starter-actuator 使用Spring Boot的Actuator的啓動器,它提供生產就緒功能,幫助您監控和管理您的應用程序 pom

最後,Spring Boot還包括以下啓動器,如果希望排除或替換特定的技術方面,可以使用這些啓動器:

表13.3。 Spring Boot技術啓動器

名稱 描述 pom
spring-boot-starter-jetty 使用Jetty作爲嵌入式servlet容器的入門。 替代spring-boot-starter-tomcat pom
spring-boot-starter-log4j2 使用Log4j2進行日誌記錄的入門。替代spring-boot-starter-logging pom
spring-boot-starter-logging 使用Logback進行日誌記錄的入門。 默認日誌啓動器 pom
spring-boot-starter-reactor-netty 使用Reactor Netty作爲嵌入式響應式HTTP服務器的啓動器。 pom
spring-boot-starter-tomcat

使用Tomcat作爲嵌入式servlet容器的入門者。 使用的默認servlet容器啓動器

spring-boot-starter-web

pom
spring-boot-starter-undertow 使用Undertow作爲嵌入式servlet容器的入門者。 替代spring-boot-starter-tomcat pom

提示

有關其他社區貢獻的啓動器的列表,請參閱GitHub上spring-boot-starters模塊中的 README 文件。 

14. 構建您的代碼

Spring Boot不需要任何特定的代碼佈局。 但是,有一些最佳實踐可以提供幫助。

14.1 使用“默認”包

當類不包含包聲明時,它被認爲是在“默認包”中。通常不推薦使用“默認包”,應該避免使用。 對於使用@ComponentScan, @EntityScan, 或 @SpringBootApplication 註釋的Spring Boot應用程序,它可能會導致特定問題,因爲每個jar中的每個類都被讀取。

提示

我們建議您遵循Java推薦的包命名規範並使用反向域名(例如,com.example.project)。

14.2 找到主應用程序類

我們通常建議您將主應用程序類放在其他類之上的根包中。 @SpringBootApplication註釋通常放在您的主類上,它隱式地爲某些項定義了一個基礎“搜索包”。 例如,如果您正在編寫JPA應用程序,則使用@SpringBootApplication帶註釋類的包來搜索@Entity項。 使用根包還允許組件掃描僅應用於您的項目。

提示

如果您不想使用@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,如下所示:

package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication 
public class Application {
 public static void main(String[] args) { 
  SpringApplication.run(Application.class, args); 
 }
}

15. 配置類

Spring Boot支持基於Java的配置。雖然可以將SpringApplication與XML源一起使用,但我們通常建議您的主要源是單個@Configuration類。通常,定義main方法的類是主要@Configuration的良好候選者。

提示

許多Spring配置示例已在Internet上發佈,使用XML配置。 如果可能,請始終嘗試使用等效的基於Java的配置。 搜索Enable *註釋可能是一個很好的起點。

15.1 導入其他配置類

您無需將所有@Configuration放入單個類中。 @Import註釋可用於導入其他配置類。 或者,您可以使用@ComponentScan自動獲取所有Spring組件,包括@Configuration類。

15.2導入XML配置

如果您絕對必須使用基於XML的配置,我們建議您仍然使用@Configuration類。然後,您可以使用@ImportResource批註來加載XML配置文件。

16.自動配置

Spring Boot自動配置嘗試根據您添加的jar依賴項自動配置Spring應用程序。 例如,如果HSQLDB在您的類路徑上,並且您尚未手動配置任何數據庫連接bean,則Spring Boot會自動配置內存數據庫。

您需要通過將@EnableAutoConfiguration或@SpringBootApplication註釋添加到其中一個@Configuration類來選擇自動配置。

提示

您應該只添加一個@SpringBootApplication或@EnableAutoConfiguration註解。 我們通常建議您僅將一個或另一個添加到主@Configuration類中。

16.1 逐步替代自動配置

自動配置是非侵入性的。 在任何時候,您都可以開始定義自己的配置以替換自動配置的指定部分。 例如,如果添加自己的DataSource bean,則默認的嵌入式數據庫支持會失效。

如果您需要了解當前正在應用的自動配置以及原因,請使用--debug開關啓動您的應用程序。 這樣做可以爲選擇的核心記錄器啓用調試日誌,並將條件報告記錄到控制檯。

16.2 禁用指定的自動配置類

如果發現正在應用您不需要的特定自動配置類,則可以使用@EnableAutoConfiguration的exclude屬性禁用它們,如以下示例所示:

import org.springframework.boot.autoconfigure.*; 
import org.springframework.boot.autoconfigure.jdbc.*; 
import org.springframework.context.annotation.*;
@Configuration 
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 
public class MyConfiguration {

}

如果類不在類路徑上,則可以使用批註的excludeName屬性並指定完全限定名稱。 最後,您還可以使用spring.autoconfigure.exclude屬性控制要排除的自動配置類列表。

提示

您可以在註解級別和使用屬性定義排除項。

17. Spring Beans和依賴注入

您可以自由地使用任何標準的Spring Framework技術來定義bean及其注入的依賴項。 爲簡單起見,我們經常發現使用@ComponentScan(找到你的bean)並使用@Autowired(做構造函數注入)效果很好。

如果按照上面的建議構建代碼(在根包中定位應用程序類),則可以添加不帶任何參數的@ComponentScan。 所有應用程序組件(@ Component,@ Service,@ Repository,@ Controller等)都自動註冊爲Spring Beans。

以下示例顯示了一個@Service Bean,它使用構造函數注入來獲取所需的RiskAssessor bean:

package com.example.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;
 }
 // ...

}

如果bean有一個構造函數,則可以省略@Autowired,如以下示例所示:

@Service
public class DatabaseAccountService implements AccountService {
 private final RiskAssessor riskAssessor;
 public DatabaseAccountService(RiskAssessor riskAssessor) { 
  this.riskAssessor = riskAssessor;
 }
 // ...

}

提示

請注意使用構造函數注入如果將riskAssessor字段標記爲final,表示無法隨意更改它。

18. 使用@SpringBootApplication註解

許多Spring Boot開發人員喜歡他們的應用程序使用自動配置,組件掃描,並能夠在他們的“應用程序類”上定義額外的配置。 單個@SpringBootApplication註釋可用於啓用這三個功能,即:

  • @EnableAutoConfiguration:啓用Spring Boot的自動配置機制
  • @ComponentScan:在應用程序所在的包上啓用@Component掃描(請參閱最佳實踐)
  • @Configuration:允許在上下文中註冊額外的bean或導入其他配置類

@SpringBootApplication註解等同於使用@Configuration,@ EnableAutoConfiguration
和@ComponentScan及其默認屬性,如以下示例所示:

package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 與@Configuration @EnableAutoConfiguration @ComponentScan相同
public class Application {
 public static void main(String[] args) { 
  SpringApplication.run(Application.class, args); 
 }
}

注意事項

@SpringBootApplication還提供別名來自定義@EnableAutoConfiguration和@ComponentScan的屬性。

注意事項

這些功能都不是必需的,您可以選擇通過它啓用的任何功能替換此單個註解。 例如,您可能不希望在應用程序中使用組件掃描:

package com.example.myapplication;
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); 
 }
}

在此示例中,Application與任何其他SpringBoot應用程序一樣,只是不會自動檢測@ Component-annotated類,並且顯式導入用戶定義的bean(請參閱@Import)。

19. 運行您的應用程序

將應用程序打包爲jar並使用嵌入式HTTP服務器的最大優勢之一是,您可以像運行任何其他服務器一樣運行應用程序。 調試Spring Boot應用程序也很容易。 您不需要任何特殊的IDE插件或擴展。

注意事項

本節僅介紹基於jar的包裝。 如果您選擇將應用程序打包爲war文件,則應參閱服務器和IDE文檔。

19.1 通過IDE運行

您可以從IDE運行Spring Boot應用程序作爲簡單的Java應用程序。 但是,您首先需要導入項目。 導入步驟因IDE和構建系統而異。 大多數IDE可以直接導入Maven項目。 例如,Eclipse用戶可以選擇Import ...→Existing Maven“文件”菜單中的項目。

如果無法將項目直接導入IDE,則可以使用構建插件生成IDE元數據。 Maven包含Eclipse和IDEA的插件。Gradle提供各種IDE的插件。

提示

如果您不小心運行了兩次Web應用程序,則會看到“端口已在使用中”錯誤。STS用戶可以使用“重新啓動”按鈕而不是“運行”按鈕來確保關閉任何現有實例。

19.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

19.3使用Maven插件

Spring Boot Maven插件包含一個運行目標,可用於快速編譯和運行您的應用程序。應用程序以分解形式運行,就像在IDE中一樣。 以下示例顯示了運行Spring Boot應用程序的典型Maven命令:

$ mvn spring-boot:run

您可能還想使用MAVEN_OPTS操作系統環境變量,如以下示例所示:

$ export MAVEN_OPTS=-Xmx1024m

19.4 使用Gradle插件

Spring Boot Gradle插件還包含一個bootRun任務,可用於以分解形式運行您的應用程序。每當您應用org.springframework.boot和java插件時都會添加bootRun任務,如以下示例所示:

$ gradle bootRun

您可能還想使用JAVA_OPTS操作系統環境變量,如以下示例所示:

$ export JAVA_OPTS=-Xmx1024m

19.5 熱部署

由於Spring Boot應用程序只是普通的Java應用程序,因此JVM熱交換應該是開箱即用的。 JVM熱交換在某種程度上受限於它可以替換的字節碼。 要獲得更完整的解決方案,可以使用 JRebel 。

spring-boot-devtools模塊還支持熱部署。 有關詳細信息,請參閱本章後面的 第20章, 開發人員工具 部分 什麼是熱部署章節.

20. 開發人員工具

Spring Boot包含一組額外的工具,可以使應用程序開發體驗更加愉快。 spring-boot-devtools模塊可以包含在任何項目中,以提供額外的開發時間功能。 要包含devtools支持,請將模塊依賴項添加到您的構建中,如以下Maven和Gradle列表所示:

Maven.、

<dependencies>
 <dependency> 
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-devtools</artifactId> 
  <optional>true</optional>
 </dependency>
</dependencies>

Gradle.

configurations { 
 developmentOnly 
 runtimeClasspath {
  extendsFrom developmentOnly 
 }
}
dependencies { 
 developmentOnly("org.springframework.boot:spring-boot-devtools")
}

注意事項

運行完全打包的應用程序時會自動禁用開發人員工具。如果您的應用程序是從java-jar啓動的,或者它是從特殊的類加載器啓動的,那麼它被視爲“生產應用程序”。在Maven中將依賴項標記爲可選,或在Gradle中使用自定義`開發的配置(如上所示)是最佳實踐,可防止devtools傳遞應用於使用您的項目的其他模塊。

提示

重新打包的歸檔默認情況下不包含devtools。如果要使用某個遠程devtools功能,則需要禁用excludeDevtools構建屬性以包含它。 該屬性由Maven和Gradle插件支持。

20.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- 詳細配置屬性。

注意事項

如果您不希望應用屬性默認值,則可以在application.properties中將spring.devtools.add-properties設置爲false。

提示

有關devtools應用的屬性的完整列表,請參考DevToolsPropertyDefaultsPostProcessor.

20.2 自動重啓

使用spring-boot-devtools的應用程序會在類路徑上的文件發生更改時自動重新啓動。 在IDE中工作時,這可能是一個有用的功能,因爲它爲代碼更改提供了非常快速的反饋循環。 默認情況下,將監視類路徑上指向文件夾的任何條目的更改。 請注意,某些資源(如靜態資產和視圖模板)無需重新啓動應用程序。

觸發重啓

由於DevTools監視類路徑資源,因此觸發重新啓動的唯一方法是更新類路徑。 導致更新類路徑的方式取決於您使用的IDE。在Eclipse中,保存修改後的文件會導致更新類路徑並觸發重新啓動。 在IntelliJ IDEA中,構建項目(Build - > Build Project)具有相同的效果。

注意事項

只要啓用了分叉,您也可以使用受支持的構建插件(Maven和Gradle)啓動應用程序,因爲
DevTools需要一個獨立的應用程序類加載器才能正常運行。默認情況下,Gradle和Maven在類路徑上檢測到DevTools時會這樣做。

提示

與LiveReload一起使用時,自動重啓非常有效。有關詳細信息,請參閱LiveReload部分。如果使用
JRebel,則禁用自動重新啓動以支持動態類重新加載。其他devtools功能(例如LiveReload和屬性覆蓋)仍然可以使用。

注意事項

與LiveReload一起使用時,自動重啓非常有效。有關詳細信息,請參閱LiveReload部分。 如果使用JRebel,則禁用自動重新啓動以支持動態類重新加載。其他devtools功能(例如LiveReload和屬性覆蓋)仍然可以使用。...

注意事項

當決定類路徑上的條目是否應該在更改時觸發重新啓動時,DevTools會自動忽略名爲spring-boot,
spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的項目。

注意事項

DevTools需要自定義ApplicationContext使用的ResourceLoader。 如果您的應用程序已經提供了一個,它將被包裝。 不支持直接覆蓋ApplicationContext上的getResource方法。

重新啓動vs 重新加載

Spring Boot提供的重啓技術使用兩個類加載器。 不更改的類(例如,來自第三方jar的類)將加載到基類加載器中。您正在積極開發的類將加載到重新啓動的類加載器中。重新啓動應用程時,將重新啓動重新啓動的類加載器並創建一個新的類加載器。這種方法意味着應用程序重新啓動通常比“冷啓動”快得多,因爲基本類加載器已經可用並已填充。

如果您發現重新啓動對於您的應用程序來說不夠快或遇到類加載問題,您可以考慮從ZeroTurnaround
重新加載 JRebel 等技術。 這些工作通過在加載類時重寫類使它們更適合重新加載。

記錄條件評估中的更改

默認情況下,每次應用程序重新啓動時,都會記錄一個顯示條件評估增量的報告。該報告顯示了在進行更改(例如添加或刪除Bean以及設置配置屬性)時對應用程序的自動配置所做的更改。

要禁用報告的日誌記錄,請設置以下屬性:

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,您需要設置以下屬性:、

spring.devtools.restart.exclude=static/**,public/**

提示

如果要保留這些默認值並添加其他排除項,請改用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 System屬性設置爲false,如圖所示 在以下示例中:

public static void main(String[] args) { 
 System.setProperty("spring.devtools.restart.enabled", "false"); 
 SpringApplication.run(MyApp.class, args);
}

使用觸發器文件

果使用不斷編譯已更改文件的IDE,則可能更喜歡僅在指定時間觸發重新啓動。爲此,您可以使用“觸發器文件”,這是一個特殊文件,當您想要實際觸發重新啓動檢查時必須對其進行修改。更改文件只會觸發檢查,只有在Devtools檢測到必須執行某些操作時纔會重新啓動。觸發器文件可以手動更新,也可以使用IDE插件更新。

要使用觸發器文件,請將spring.devtools.restart.trigger-file屬性設置爲觸發器文件的路徑。

提示

您可能希望將spring.devtools.restart.trigger文件設置爲 全局設置,以便所有項目的行爲方式相同。

自定義重新啓動類加載器

如前面在 重新啓動 vs 重新加載 部分中所述,使用兩個類加載器實現了重啓功能。 對於大多數應用程序,此方法運行良好。 但是,它有時會導致類加載問題。

默認情況下,IDE中的任何打開項目都使用“restart”類加載器加載,並且任何常規.jar文件都使用“base”
類加載器加載。 如果您處理多模塊項目,並且並非每個模塊都導入到IDE中,則可能需要自定義內容。 爲此,您可以創建META-INF / spring-devtools.properties文件。

spring-devtools.properties文件可以包含以restart.exclude和restart.include爲前綴的屬性。 include元素是應該被拉到“重啓”的項目

classloader和exclude元素是應該下推到“base”類加載器中的項。 該屬性的值是應用於類路徑的正則表達式模式,如以下示例所示:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar  
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

注意事項

所有屬性鍵必須是唯一的。只要屬性以restart.include開頭即可。或者restart.exclude。已經被考慮了。

提示

從classpath所有META-INF / spring-devtools.properties被加載。 您可以將文件打包到項目中,也可以打包在項目使用的庫中。

已知限制

對於使用標準ObjectInputStream反序列化的對象,重新啓動功能不起作用。如果需要反序列化數據,
可能需要將Spring的ConfigurableObjectInputStream與Thread.currentThread()。
getContextClassLoader()結合使用。

不幸的是,幾個第三方庫反序列化而沒有考慮上下文類加載器。 如果您發現此類問題,則需要向原始作者請求修復。

20.3 LiveReload

spring-boot-devtools模塊包含一個嵌入式LiveReload服務器,可用於在資源更改時觸發瀏覽器刷新。 LiveReload瀏覽器擴展程序可從 livereload.com免費用於Chrome,Firefox和Safari。

如果您不想在應用程序運行時啓動LiveReload服務器,則可以將spring.devtools.livereload.enabled屬性設置爲false。

注意事項

您一次只能運行一個LiveReload服務器。 在啓動應用程序之前,請確保沒有其他LiveReload服務器正在運行。 如果從IDE啓動多個應用程序,則只有第一個具有LiveReload支持。

20.4 全局設置

您可以通過將名爲.spring-boot-devtools.properties的文件添加到$ HOME文件夾來配置全局devtools設置(請注意,文件名以“。”開頭)。添加到此文件的任何屬性都適用於計算機上使用devtools的所有Spring Boot應用程序。 例如,要將restart配置爲始終使用觸發器文件,您需要添加以下屬性:

~/.spring-boot-devtools.properties.

spring.devtools.reload.trigger-file=.reloadtrigger

20.5 遠程應用

Spring Boot開發人員工具不僅限於本地開發。 遠程運行應用程序時,您還可以使用多個功能。 遠程支持是選擇加入。 要啓用它,您需要確保devtools包含在重新打包的存檔中,如下面的清單所示:

<build>
 <plugins>
  <plugin> 
   <groupId>org.springframework.boot</groupId> 
   <artifactId>spring-boot-maven-plugin</artifactId> 
   <configuration> 
    <excludeDevtools>false</excludeDevtools> 
   </configuration>
  </plugin>
 </plugins>
</build>

然後,您需要設置spring.devtools.remote.secret屬性,如以下示例所示:

spring.devtools.remote.secret=mysecret

警告

在遠程應用程序上啓用spring-boot-devtools存在安全風險。 您永遠不應該在生產部署上啓用支持。

遠程devtools支持由兩部分組成:一個接受連接的服務器端端點和一個在IDE中運行的客戶端應用程序。 設置spring.devtools.remote.secret屬性後,將自動啓用服務器組件。 必須手動啓動客戶端組件。

運行遠程客戶端應用程序

遠程客戶端應用程序旨在從IDE中運行。您需要運行
org.springframework.boot.devtools.RemoteSpringApplication,
其類路徑與您連接的遠程項目相同。 應用程序的一個必需的參數是其連接的遠程URL。

例如,如果您使用的是Eclipse或STS,並且有一個名爲my-app的項目已部署到Cloud Foundry,那麼您將執行以下操作:

  • 從“運行”菜單中選擇“運行配置...”。
  • 創建一個新的Java應用程序“啓動配置”。
  • 瀏覽我的應用程序項目。
  • 使用org.springframework.boot.devtools.RemoteSpringApplication作爲主類。
  • 將https://myapp.cfapps.io添加到Program參數(或任何遠程URL)。

正在運行的遠程客戶端可能類似於以下列表:

  .   ____          _                                              __ _ _ 
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \ 
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) ) 
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / / 
 =========|_|==============|___/===================================/_/_/_/ 
 :: Spring Boot Remote :: 2.1.0.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-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-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)

注意事項

因爲遠程客戶端使用與真實應用程序相同的類路徑,所以它可以直接讀取應用程序屬性。 這是如何讀取spring.devtools.remote.secret屬性並將其傳遞給服務器進行身份驗證的方法。

提示

始終建議使用https://作爲連接協議,以便加密流量並且不會截獲密碼。

提示

如果需要使用代理來訪問遠程應用程序,請配置spring.devtools.remote.proxy.host和spring.devtools.remote.proxy.port屬性。

遠程更新

遠程客戶端以與本地重新啓動相同的方式監視應用程序類路徑以進行更改。任何更新的資源都會被推送到遠程應用程序,並且(如果需要)會觸發重新啓動。如果您迭代使用本地沒有的雲服務的功能,這將非常有用。 通常,遠程更新和重新啓動比完全重建和部署週期快得多。

注意事項

僅在遠程客戶端運行時監視文件。 如果在啓動遠程客戶端之前更改文件,則不會將其推送到遠程服務器。

21. 打包用於生產中的應用

可執行jar可用於生產部署。 由於它們是獨立的,因此它們也非常適合基於雲的部署。

對於其他“生產就緒”功能,例如運行狀況,審計和度量REST或JMX端點,請考慮添加spring-boot-actuator。有關詳細信息,請參見 Part V, “Spring Boot 執行器: 生產就緒功能” 。

22. 接下來要閱讀的內容

您現在應該瞭解如何使用Spring Boot以及您應該遵循的一些最佳實踐。您現在可以繼續深入瞭解特定的 Spring Boot 功能 in depth, 或者您可以跳過並閱讀Spring Boot的 “生產就緒” 方面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章