(三)Spring Boot的使用 (翻譯自Spring Boot官方教程文檔)1.5.9.RELEASE

  • 查看本文英文文檔,請點擊 me
  • 本文將在對原英文文檔進行翻譯的基礎上,結合做者動手實踐一步步圖文並茂展現給你們!
  • 小弟學識尚淺,若文章有不對的地方,請在評論區幫小弟指出,很是感謝!

第三部分 使用 Spring Boot

  • 本節將更詳細地介紹如何使用Spring Boot。它涵蓋了系統構建,自動配置以及如何運行應用程序等主題。咱們還介紹了一些Spring Boot的最佳實踐。雖然Spring Boot沒有特別的特殊之處,(Spring Boot只是你可使用的另外一個Java庫(jar)),但其中有一些建議,當你遵循時,會使你的開發過程變得更加容易一些。若是您剛剛開始使用Spring Boot,則可能須要先閱讀入門指南,而後再深刻本節。

1三、系統構建

  • 強烈建議您選擇支持依賴管理的構建系統,而且可使用發佈到「Maven Central」存儲庫的artifacts。咱們建議您選擇MavenGradle。Spring Boot能夠與其餘構建系統(例如Ant)一塊兒工做,可是它們之間的兼容性並非特別好。

13.一、依賴管理

  • Spring Boot的每一個發行版都提供了一個支持的依賴列表。在實踐中,您不須要爲構建配置中(即在Pom.xml文件中)的任何這些依賴項提供一個版本(也就是能夠省略version標籤),由於Spring Boot正在爲您進行管理(也就是Spring Boot 已經幫咱們配置了)。當您升級Spring Boot自己(也就是切換到更高版本的Spring Boot)時,這些依賴關係也將以一致的方式進行升級。

    若是你以爲這是必要的,你仍然能夠指定一個版本並覆蓋Spring Boot的建議。html

  • 該列表包含了你能使用 Spring Boot 的全部 Spring 模塊和一系列第三方類庫。該列表能夠做爲標準物料清單spring-boot-dependencies)提供,也能夠爲MavenGradle提供額外的專用支持。

    Spring Boot的每一個版本都與一個Spring Framework的基礎版本相關聯,所以咱們強烈建議您不要自行指定其版本。java

13.二、Maven

  • Maven用戶能夠從spring-boot-starter-parent項目中繼承,以得到相應的默認值。 父項目提供如下功能:
    1. Java 1.6做爲默認的編譯器級別。
    2. UTF-8源碼編碼。
    3. 一個依賴管理系統,所以你能夠針對公共的依賴省略<version>標籤,進而從spring-boot-dependencies POM中繼承。
    4. 優雅的資源過濾
    5. Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).
    6. application.propertiesapplication.yml中的配置進行資源過濾(其實就是maven打包時指定哪些文件要過濾,不參與打包),包括特定於配置文件的文件(例如application-foo.propertiesapplication-foo.yml
  • 最後一點:因爲默認配置文件接受Spring樣式佔位符($ {...}),Maven過濾被改成使用@ .. @佔位符(您能夠用Maven屬性resource.delimiter覆蓋)。
13.2.一、繼承父starter工程來建立 Spring Boot
  • 要將項目配置爲從spring-boot-starter-parent中繼承,只需設置<parent>
    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>
    複製代碼

    您只須要在上面parent依賴項上指定Spring Boot版本號。 若是您導入更多的starter,則能夠安全地省略版本號(即<version>)。git

  • 經過該設置,您還能夠經過在本身的項目中重寫屬性來覆蓋各個依賴項。 例如,要升級到另外一個Spring Data發行版,您須要將如下內容添加到您的pom.xml中。
    <properties>
        <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
    </properties>
    複製代碼

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

13.2.二、不繼承父starter工程來建立 Spring Boot
  • 並非全部人都喜歡使用繼承自spring-boot-starter-parent POM的方式來使用 Spring Boot,可能你有本身的標準(也就是自定義配置)或者你單單就喜歡顯式地聲明全部的maven配置。
  • 若是您不想使用spring-boot-starter-parent,你仍然能夠經過使用scope = import dependency來保留依賴關係管理(但不是插件管理):
    <dependencyManagement>
         <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.9.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    複製代碼
  • 如上所述,該設置不容許您使用屬性覆蓋單個依賴項。 爲了達到一樣的結果,你須要在spring-boot-dependencies標籤(也就是pom文件的dependencies標籤)以前在項目的dependencyManagement中添加一個條目。 例如,要升級到另外一個Spring Data發行版,您須要將如下內容添加到您的pom.xml中。
    <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>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.9.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    複製代碼

    在上面的例子中,咱們指定了一個BOM(物料清單,這裏指的是pom.xml),可是任何依賴類型均可以被覆蓋。web

13.2.三、改變 Java 版本
  • spring-boot-starter-parent選擇至關保守的Java兼容性(指的是上面說的 Java 6)。 若是您想遵循咱們的建議並使用較新的Java版本,則能夠添加一個java.version屬性:
    <properties>
        <java.version>1.8</java.version>
    </properties>
    複製代碼
13.2.四、使用 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的起始parent POM,你只須要添加插件,除非你想改變在父代中定義的配置,不然不須要進行配置。正則表達式

13.三、Gradle

  • Gradle用戶能夠直接在他們的dependencies部分導入starters。 與Maven不一樣的是,沒有super parent能夠導入來共享某些配置。
    repositories {
        jcenter()
    }
    dependencies {
        compile("org.springframework.boot:spring-boot-starter-web:1.5.9.RELEASE")
    }
    複製代碼
  • spring-boot-gradle-plugin也是可用的,並提供了建立可執行jar和從源項目運行項目的任務。 它還提供依賴管理,除其餘功能外,還容許您省略由Spring Boot管理的任何依賴項的版本號:
    plugins {
        id 'org.springframework.boot' version '1.5.9.RELEASE'
        id 'java'
    }
    repositories {
        jcenter()
    }
    dependencies {
        compile("org.springframework.boot:spring-boot-starter-web")
        testCompile("org.springframework.boot:spring-boot-starter-test")
    }
    複製代碼

13.四、Ant

  • 主要講如何使用Ant進行構建,因爲前面說到Spring Boot兼容不太好,因此興趣的能夠點擊此處

13.五、Starters

  • starters是一系列能夠引進你項目的依賴描述符(dependency descriptors我以爲其實就是一些jar包,裏邊的pom.xml文件幫咱們作了某些配置而已)。您能夠獲得所須要的全部關於Spring及其相關技術的一站式服務,無需搜索示例代碼,也不須要粘貼大量依賴描述符(傳統咱們pom.xml都要引入不少的<dependency/>)。例如,若是你想開始使用SpringJPA來訪問數據庫,只需在你的項目中加入spring-boot-starter-data-jpa依賴項,你就能夠開始編碼了喲~
  • starters包含了許多你須要快速運行一個項目並傳遞依賴項的依賴。(即它會自動傳遞依賴)。
    爲何叫starters這個名字呢?

    全部的官方starter都遵循這個spring-boot-starter-*命名規範,*表明某一具體的應用(好比web應用程序)。這種命名結構旨在幫助您找到某一具體的starter。許多IDE中的Maven集成容許您按名稱搜索依賴項。例如,安裝某一具體的Eclipse``STS插件後,只需在POM編輯器中點擊ctrl-space,而後鍵入「spring-boot-starter」獲取完整列表。正如建立本身的starter中所解釋的,第三方starter不該該以spring-boot爲開始,由於它是爲官方Spring Boot工件(artifacts)保留的。一個表示acme應用的第三方starter的命名可能就是acme-spring-boot-starterredis

  • 如下就是 Spring Boot 在org.springframework.boot包下定義的一些starter
    表格13.1 Spring Boot應用程序starters
    名稱 描述 Pom
    spring-boot-starter 核心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進行面向方面編程的starter POM
    spring-boot-starter-artemis 使用Apache Artemis進行JMS消息傳遞 POM
    spring-boot-starter-batch 使用Spring Batch POM
    spring-boot-starter-cache 使用Spring框架的緩存支持 POM
    spring-boot-starter-cloud-connectors 使用Spring Cloud鏈接器的starter,可簡化Cloud Foundry和Heroku等雲平臺中的服務鏈接 POM
    spring-boot-starter-data-cassandra 使用Cassandra分佈式數據庫和Spring Data Cassandra POM
    spring-boot-starter-data-couchbase 使用面向文檔的數據庫Couchbase和Spring Data Couchbase POM
    spring-boot-starter-data-elasticsearch 使用搜索、分析引擎Elasticsearch和Spring Data Elasticsearch POM
    spring-boot-starter-data-gemfire 使用分佈式數據存儲GemFire和Spring Data GemFire POM
    spring-boot-starter-data-jpa 使用帶有Hibernate的Spring Data JPA POM
    spring-boot-starter-data-ldap 使用Spring Data LDAP POM
    spring-boot-starter-data-mongodb 使用面向文檔的數據庫MongoDB和Spring Data MongoDB POM
    spring-boot-starter-data-neo4j 使用圖形數據庫Neo4j和Spring Data Neo4j POM
    spring-boot-starter-data-redis 使用帶有Spring Data Redis和Jedis客戶端的Redis鍵值數據存儲 POM
    spring-boot-starter-data-rest Starter for exposing Spring Data repositories over REST using Spring Data REST POM
    spring-boot-starter-data-solr 結合Spring Data Solr使用Apache 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 HATEOAS構建基於超媒體的RESTful Web應用程序 POM
    spring-boot-starter-integration 使用Spring集成 POM
    spring-boot-starter-jdbc 將JDBC與Tomcat JDBC鏈接池配合使用 POM
    spring-boot-starter-jersey 使用JAX-RS和Jersey構建RESTful Web應用程序的starter。是Spring-Boot-Starter-Web的另外一種選擇 POM
    spring-boot-starter-jooq 使用jOOQ訪問SQL數據庫的starterspring-boot-starter-data-jpaspring-boot-starter-jdbc的替代方案 POM
    spring-boot-starter-jta-atomikos 使用Atomikos的JTA事務 POM
    spring-boot-starter-jta-bitronix 使用Bitronix的JTA事務 POM
    spring-boot-starter-jta-narayana Spring Boot Narayana JTA Starter POM
    spring-boot-starter-mail 使用Java Mail和Spring Framework支持的電子郵件發送 POM
    spring-boot-starter-mobile 使用Spring Mobile構建Web應用程序 POM
    spring-boot-starter-mustache 使用Mustache視圖構建MVC Web應用程序 POM
    spring-boot-starter-security 使用Spring Security POM
    spring-boot-starter-social-facebook 使用Spring社交Facebook POM
    spring-boot-starter-social-linkedin 使用Spring社交LinkedIn POM
    spring-boot-starter-social-twitter 使用Spring社交twitter POM
    spring-boot-starter-test Starter用於測試包含JUnit,Hamcrest和Mockito等庫的Spring Boot應用程序 POM
    spring-boot-starter-thymeleaf 使用Thymeleaf視圖構建MVC Web應用程序 POM
    spring-boot-starter-validation 經過Hibernate Validator使用Java Bean驗證 POM
    spring-boot-starter-web 用於構建Web的starter,包括使用Spring MVC的RESTful應用程序。 使用Tomcat做爲默認的嵌入容器 POM
    spring-boot-starter-web-services 使用Spring Web Services POM
    spring-boot-starter-websocket 使用Spring Framework的WebSocket支持構建WebSocket應用程序 POM
  • 除了應用程序starter以外,還可使用如下starter來作好相應的生產準備:
    表格13.2 Spring Boot 產品starters
    名稱 描述 POM
    spring-boot-starter-actuator 使用具備生產準備功能的Spring Boot的執行器,能夠幫助您監控和管理您的應用程序 POM
    spring-boot-starter-remote-shell 使用CRaSH遠程shell經過SSH監視和管理您的應用程序。 自1.5以來已棄用 POM
  • 最後,Spring Boot還包括一些能夠用來排除或交換特定技術門面的starters
    表格13.3 Spring Boot 技術starters
    名稱 描述 POM
    spring-boot-starter-jetty 使用Jetty做爲嵌入式servlet容器的starterspring-boot-starter-tomcat的替代方案 POM
    spring-boot-starter-log4j2 使用Log4j2進行日誌記錄的starterspring-boot-starter-logging 的替代方法 POM
    spring-boot-starter-logging 使用Logback進行日誌記錄。 默認日誌starter POM
    spring-boot-starter-tomcat 使用Tomcat做爲嵌入式servlet容器的starterspring-boot-starter-web使用的默認servlet容器starter POM
    spring-boot-starter-undertow 使用Undertow做爲嵌入式servlet容器的starterspring-boot-starter-tomcat的替代方案 POM

    有關其餘社區貢獻者的列表,請參閱GitHub上的spring-boot-starters模塊中的README文件spring

1四、結構化你的代碼

  • Spring Boot不須要任何特定的代碼佈局,可是,有一些最佳實踐能夠幫助。

14.一、使用「默認的」package

  • 當一個類沒有聲明package時,咱們通常會認爲這個類位於「默認包」中。一般不鼓勵使用「默認軟件包」,且應該避免使用「默認軟件包」。對於使用@ComponentScan@EntityScan@SpringBootApplication註釋的Spring Boot應用程序來講,使用「默認包」可能會致使特定的問題,由於每一個jar的每一個類都將被讀取。(這裏其實說的是Spring Boot會進行組件、實體、包的掃描@ComponentScan

    咱們建議您遵循Java推薦的軟件包命名約定,並使用反向域名(例如com.example.project)。mongodb

14.二、定位咱們的主應用程序類

  • 咱們一般建議您將主應用程序類放在其餘類的根包中。@EnableAutoConfiguration註釋一般放在主類上,而且它隱含地爲某些項目定義了一個基本的「搜索包」。例如,若是您正在編寫JPA應用程序,則@EnableAutoConfiguration註釋類的包將用於搜索@Entity條目。
  • 使用根包也容許使用@ComponentScan註釋而不須要指定basePackage屬性。若是您的主類位於根包中,也可使用@SpringBootApplication註釋。
  • 這是一個典型的項目結構:
    com
        +- example
            +- myproject
                +- Application.java
                +- domain
                    +- Customer.java
                    +- CustomerRepository.java
                +- service
                    +- CustomerService.java
                +- web
                    +- CustomerController.java
    複製代碼
  • Application.java文件將聲明main方法以及基本的@Configuration
    package com.example.myproject;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableAutoConfiguration
    @ComponentScan
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    複製代碼

1五、配置類

  • Spring Boot支持基於Java的配置。儘管可使用XML源調用SpringApplication.run(),咱們一般建議您的主要來源是@Configuration類。一般,定義main方法的類也是@Configuration的一個首選。

    在互聯網上已經發布了許多使用XML配置的Spring配置示例。 若是可能,請始終嘗試使用基於Java的等效配置。 搜索Enable*註釋能夠是一個很好的起點。shell

15.一、導入額外的配置類

  • 你不須要把你全部的@Configuration放到一個類中。@Import註解可用於導入其餘配置類。或者,您可使用@ComponentScan自動獲取全部Spring組件,包括@Configuration類。

15.二、帶入XML配置

  • 若是您絕對必須使用基於XML的配置,咱們建議您仍以@Configuration類開頭。而後您可使用額外的@ImportResource註解來加載XML配置文件。

1六、自動配置

  • Spring Boot自動配置會嘗試根據您添加的jar依賴項自動配置您的Spring應用程序。例如,若是HSQLDB在您的類路徑中,而且您沒有手動配置任何數據庫鏈接Bean,那麼咱們將自動配置一個內存數據庫。
  • 您須要經過將@EnableAutoConfiguration@SpringBootApplication註釋添加到其中一個@Configuration類來選擇自動配置。

    您應該只添加一個@EnableAutoConfiguration註釋。 咱們一般建議您將其添加到您的主要@Configuration類。

16.一、逐漸取代自動配置

  • 自動配置是非侵入式的,您能夠隨時開始定義本身的配置來替換自動配置的特定部分。若是添加本身的DataSource Bean,則默認的嵌入式數據庫支持將失效。
  • 若是您須要瞭解當前正在應用的自動配置,以及爲何?那麼請使用--debug參數啓動您的應用程序(也就是debug模式啓動應用程序)。 這將啓用選擇核心記錄器的調試日誌,並將自動配置報告記錄到控制檯。

16.二、禁用特定的自動配置

  • 若是您發現正在應用您不須要的特定自動配置類,則可使用@EnableAutoConfigurationexclude屬性來禁用它們。
    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屬性(這個主要在property文件中聲明)來控制自動配置類的列表。

    你能在註解級別和property配置文件級別設置警用自動相應的配置。(注:一個類聲明瞭@Configuration註解則表示該類是一個配置類,能夠被禁用)

1七、Spring Bean 和 依賴注入

  • 您能夠自由使用任何標準的Spring框架技術來定義您的bean及其注入的依賴關係。 爲了簡單起見,咱們常常發現使用@ComponentScan來查找bean,並結合使用@Autowired構造函數注入效果最好。
  • 若是按上面的建議構建代碼(在根包中查找應用程序類),則能夠添加@ComponentScan而不帶任何參數。 全部的應用程序組件(@Component@Service@Repository@Controller等)都將被自動註冊爲Spring Bean
  • 這裏是一個示例@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;
        //此處省略了@Autowired
        public DatabaseAccountService(RiskAssessor riskAssessor) {
            this.riskAssessor = riskAssessor;
        }
        // ...
    }
    複製代碼
  • 請注意,如何使用構造函數注入容許riskAssessor字段被標記爲final,代表它不能被隨後更改。

1八、使用@SpringBootApplication註解

  • 許多Spring Boot開發人員老是使用@Configuration@EnableAutoConfiguration@ComponentScan註解其主類。因爲這些註釋常常一塊兒使用(特別是若是您遵循以上最佳實踐),Spring Boot提供了一種更方便的@SpringBootApplication替代方法。
  • @SpringBootApplication註釋等價於使用@Configuration@EnableAutoConfiguration@ComponentScan及其默認屬性:
    package com.example.myproject;
    
    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的屬性。

1九、運行你的應用程序

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

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

19.一、從IDE中運行

  • 你能夠像普通Java應用程序同樣在IDE中運行Spring Boot 應用。可是,首先你須要將項目導入IDE中,大多數IDE能夠直接導入Maven項目,例如在EclipseFile -> Import -> Existing Maven Projects
  • 若是不能直接將項目導入IDE,則可使用構建插件生成IDE元數據。 Maven包含EclipseIDEA的插件; Gradle也爲各類IDE提供了各類插件

    若是您不當心運行了兩次Web應用程序,則會看到「端口已被使用Port already in use」錯誤。 STS用戶可使用"Relaunch"按鈕而不是"Run"來確保關閉任何現有的實例。

19.二、做爲打包的應用程序運行

  • 若是您使用Spring Boot Maven或Gradle插件建立可執行jar,則可使用java -jar運行應用程序。 例如:

    $ java -jar target/myproject-0.0.1-SNAPSHOT.jar

  • 也能夠運行打包的應用程序並啓用遠程調試支持。 這使您能夠將調試器附加到打包的應用程序中:(主要用於遠程調試) $ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ -jar target/myproject-0.0.1-SNAPSHOT.jar

19.三、使用Maven插件

  • Spring Boot Maven插件包含一個可用於快速編譯和運行應用程序的run目標。 應用程序以分解形式運行,就像在IDE中同樣。

    $ mvn spring-boot:run

  • 您可能還想使用有用的操做系統環境變量:

    $ export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=128M

19.四、使用Gradle插件

  • Spring Boot Gradle插件還包含一個bootRun任務,可用於以分解形式運行您的應用程序。 不管什麼時候導入spring-boot-gradle-plugin,都會添加bootRun任務:

    $ gradle bootRun

  • 您可能還想使用有用的操做系統環境變量:

    $ export JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=128M

19.五、熱插拔

  • 由於Spring Boot僅僅是普通的Java應用程序,JVM熱插拔應該是開箱即用的。JVM熱交換在某種程度上受限於它能夠替換的字節碼,爲了得到更完整的解決方案,可使用JRebelSpring Loaded項目。

20、開發者工具

  • Spring Boot包含一組額外的工具,可使應用程序開發體驗更愉快。 spring-boot-devtools模塊能夠包含在任何項目中以提供額外的開發時間功能。 要包含devtools支持,只需將模塊依賴關係添加到您的版本:

    Maven.
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    複製代碼
    Gradle.
    dependencies {
        compile("org.springframework.boot:spring-boot-devtools")
    }
    複製代碼

    運行完整打包的應用程序時,開發者工具會自動禁用。 若是您的應用程序是使用java -jar方式啓動的,或者若是它是使用特殊的類加載器啓動的,那麼它就被認爲是「生產應用程序」。 將依賴關係標記爲可選的是一種最佳實踐,能夠防止devtools經過項目傳遞到其餘模塊。 Gradle不支持optional的依賴關係,所以您可能但願在此期間看看propdeps插件

    從新打包的archives在默認狀況下不包含devtools。 若是您想使用某些遠程devtools功能,則須要禁用excludeDevtools構建屬性以包含它。 該屬性支持Maven和Gradle插件。

19.一、屬性默認值

  • Spring Boot支持的一些庫使用緩存來提升性能。 例如,模板引擎將緩存已編譯的模板,以免重複解析模板文件。 另外,Spring MVC能夠在服務靜態資源時將HTTP緩存頭添加到響應中。
  • 雖然緩存在生產中很是有益,但在開發過程當中可能會產生副作用,使您沒法看到應用程序中剛剛作出的更改。 因爲這個緣由,spring-boot-devtools默認會禁用這些緩存選項。
  • 緩存選項一般由您的application.properties文件中的設置進行配置。 例如,Thymeleaf提供了spring.thymeleaf.cache屬性。 而不須要手動設置這些屬性,spring-boot-devtools模塊將自動應用合理的開發配置。

    有關應用的屬性的完整列表,請參閱DevToolsPropertyDefaultsPostProcessor

20.二、自動重啓

  • 使用spring-boot-devtools的應用程序將在類路徑上的文件發生更改時自動重啓。 在IDE中工做時,這是一個很是有用的功能,由於它爲代碼更改提供了一個很是快速的反饋循環。 默認狀況下,將監視指向文件夾的類路徑中的任何條目以進行更改。 請注意,某些資源(如靜態資產和視圖模板)不須要從新啓動應用程序

    觸發重啓

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

    您也能夠經過受支持的構建插件(即Maven和Gradle)啓動您的應用程序,只要啓用了分叉功能,由於DevTools須要隔離的應用程序類加載器才能正常運行。 當Gradle和Maven在類路徑中檢測到DevTools時,默認會這樣作。

    與LiveReload一塊兒使用時,自動從新啓動的效果很是好。 詳情請參閱下文。 若是使用JRebel,自動從新啓動將被禁用,以支持動態類從新加載。 其餘devtools功能(如LiveReload和屬性覆蓋)仍然可使用。

    DevTools依靠應用程序上下文的關閉掛鉤在從新啓動期間關閉它。 若是您禁用了關閉掛鉤(SpringApplication.setRegisterShutdownHook(false)),它將沒法正常工做。

    當肯定類路徑上的條目在更改時會觸發從新啓動時,DevTools會自動忽略名爲spring-boot,spring-boot-devtoolsspring-boot-autoconfigurespring-boot-actuatorspring-boot-starter的項目。

    DevTools須要自定義ApplicationContext使用的ResourceLoader:若是你的應用程序已經提供了一個,它將被打包。 不支持直接覆蓋ApplicationContext上的getResource方法。

    重啓(restart) vs 從新加載(reload)

    Spring Boot提供的重啓技術經過使用兩個類加載器來工做。 不改變的類(例如來自第三方jar的類)被加載到基類加載器中。 您正在開發的類將加載到重啓類加載器中。 當應用程序從新啓動時,重啓類加載器將被丟棄,並建立一個新的。 這種方法意味着應用程序從新啓動一般比「冷啓動」快得多,由於基類加載器已經可用而且已經被填充了。

    若是您發現從新啓動對於您的應用程序來講不夠快,或者遇到類加載問題,則能夠考慮從ZeroTurnaround中獲取從新加載的技術,例如JRebel。 這些工做經過重寫類,由於他們被加載,使他們更容易從新加載。 Spring Loaded提供了另外一種選擇,可是它不支持許多框架,而且沒有商業支持。

20.2.一、排除某些資源(如靜態資源)
  • 某些資源不必定須要在更改時觸發從新啓動。 例如,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屬性。

20.2.二、監視額外的其餘路徑(Watching additional paths)
  • 您可能但願當更改不在類路徑中的文件時從新啓動或從新加載應用程序。 爲此,請使用spring.devtools.restart.additional-paths屬性來配置其餘路徑以監視更改。 您可使用上述的spring.devtools.restart.exclude屬性來控制額外路徑下的更改是否會觸發徹底從新啓動或僅實時從新加載。
20.2.三、禁用重啓
  • 若是您不想使用從新啓動功能,則可使用spring.devtools.restart.enabled屬性將其禁用。 在大多數狀況下,你能夠在你的application.properties中設置它(這將仍然初始化重啓類加載器,但它不會監視文件的變化,也就是隻要你從新啓動了Spring Boot應用程序,都會沖洗初始化一個新的重啓類加載器,上文也提到了)。(注意從新啓動關閉後啓動的區別)
  • 若是您須要徹底禁用從新啓動支持(不會有從新啓動的功能,也就不會再初始化重啓類加載器了喲~),例如,由於它不適用於特定的庫,則須要在調用SpringApplication.run(...)以前設置System屬性。 例如:
    public static void main(String[] args) {
        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(MyApp.class, args);
    }
    複製代碼
20.3.四、使用觸發器文件
  • 若是您使用連續編譯已更改文件的IDE,則可能只但願在特定時間觸發從新啓動。 要作到這一點,你可使用「觸發文件」,這是一個特殊的文件,當你想要實際觸發重啓檢查時,必須修改它。 只更改文件會觸發檢查,只有Devtools檢測到必須執行某些操做時纔會從新啓動。 觸發文件能夠手動更新,也能夠經過IDE插件進行更新。
  • 要使用觸發器文件,請使用spring.devtools.restart.trigger-file屬性。

    您可能須要將spring.devtools.restart.trigger-file設置爲全局設置,以便全部項目的行爲方式相同

20.3.五、自定義重啓類加載器
  • 正如上面「從新啓動vs從新加載」一節所述,從新啓動功能是經過使用兩個類加載器(一個基類,一個重啓類)來實現的。 對於大多數應用程序來講,這種方法運行良好,但有時候會致使類加載問題。

  • 默認狀況下,IDE中的任何打開的項目都將使用「重啓」類加載器加載,任何常規的.jar文件都將使用「基本」類加載器加載。 若是您使用多模塊項目,而不是將每一個模塊導入到IDE中,則可能須要自定義項目。 要作到這一點,你能夠建立一個META-INF/spring-devtools.properties文件。

  • spring-devtools.properties文件能夠包含restart.excluderestart.include前綴屬性。include元素是應該被拉入到「重啓」類加載器中的項目,排除元素是應該被下推到「基本」類加載器中的項目。 該屬性的值是一個將應用於類路徑的正則表達式模式。

  • 好比:

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

    全部的屬性key(這裏指上面的companycommonlibs)必須是惟一的。 只要屬性以restart.includerestart.exclude開頭的都將被考慮。

    全部類路徑中的META-INF/spring-devtools.properties都將被加載。 您能夠將文件打包到項目中,也能夠打包到項目使用的庫中。

20.3.六、已知的限制
  • 對於使用標準ObjectInputStream進行反序列化的對象,從新啓動功能沒法正常工做。 若是須要反序列化數據,則可能須要將Spring的ConfigurableObjectInputStreamThread.currentThread().getContextClassLoader()一塊兒使用。
  • 不幸的是,有些第三方庫反序列化,而不考慮上下文類加載器。 若是您發現這樣的問題,您須要向原做者請求修復。

20.三、LiveReload(一個內置服務器)

  • spring-boot-devtools模塊包含一個嵌入式LiveReload服務器,當資源發生變化時,可用於觸發瀏覽器刷新。 LiveReload瀏覽器擴展可從livereload.com的Chrome,Firefox和Safari免費得到。
  • 若是您不想在應用程序運行時啓動LiveReload服務器,則能夠將spring.devtools.livereload.enabled屬性設置爲false

    一次只能運行一個LiveReload服務器。 在開始您的應用程序以前,請確保沒有其餘LiveReload服務器正在運行。 若是您從IDE啓動多個應用程序,則只有第一個應用程序支持LiveReload

20.四、全局配置

  • 您能夠經過將一個名爲.spring-boot-devtools.properties的文件添加到您的$HOME文件夾來配置全局devtools設置(請注意,文件名以"."開頭)。 添加到此文件的任何屬性都將應用於使用devtools的計算機上的全部Spring Boot應用程序。 例如,要將從新啓動配置爲始終使用觸發器文件,能夠添加如下內容:

    ~/.spring-boot-devtools.properties.

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

20.五、遠程應用程序

  • 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屬性時,服務器組件會自動啓用。 客戶端組件必須手動啓動。

20.5.一、運行遠程客戶端應用程序
  • 遠程客戶端應用程序旨在從您的IDE中運行。 您須要使用與您要鏈接的遠程項目相同的類路徑來運行org.springframework.boot.devtools.RemoteSpringApplication。 傳遞給應用程序的非選項(non-option)參數應該是您要鏈接到的遠程URL。
  • 例如,若是您使用的是Eclipse或STS,而且您已經將一個名爲my-app的項目部署到了Cloud Foundry,則能夠執行如下操做:
    1. Run菜單中選擇Run Configurations…​
    2. 建立一個新的Java Application"launch configuration"。
    3. 瀏覽my-app項目。
    4. 使用org.springframework.boot.devtools.RemoteSpringApplication做爲主類。
    5. https://myapp.cfapps.io添加到Program arguments(或任何遠程URL)。
  • 正在運行的遠程客戶端將以下所示:
    .   ____          _                                              __ _ _
     /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
     \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) ' \/ _ \ _/ -_) ) ) ) ) '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
     =========|_|==============|___/===================================/_/_/_/
     :: Spring Boot Remote :: 1.5.9.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.hostspring.devtools.remote.proxy.port屬性。
20.5.二、遠程更新
  • 遠程客戶端將以與本地重啓相同的方式監視您的應用程序類路徑的更改。 任何更新的資源將被推送到遠程應用程序,並(若是須要)觸發從新啓動。 若是您正在迭代使用您本地沒有的雲服務的功能,這可能會很是有幫助。 一般遠程更新和從新啓動比完整的重建和部署週期快得多。

    只有遠程客戶端正在運行時纔會監視文件。 若是在啓動遠程客戶端以前更改文件,則更新操做不會將其推送到遠程服務器。

20.5.三、遠程調試隧道
  • Java遠程調試在診斷遠程應用程序的問題時很是有用。 不幸的是,當您的應用程序部署在數據中心以外時,並不老是能夠啓用遠程調試。 若是您使用基於容器的技術(例如Docker),則遠程調試也可能會很是棘手。

  • 爲了幫助解決這些限制,devtools支持經過HTTP隧道傳輸遠程調試流量。 遠程客戶端在端口8000上提供本地服務器,您能夠將其附加到遠程調試器。 創建鏈接後,調試流量將經過HTTP發送到遠程應用程序。 若是你想使用不一樣的端口,你可使用spring.devtools.remote.debug.local-port屬性。

  • 您須要確保您的遠程應用程序在啓用遠程調試的狀況下啓動。 這一般能夠經過配置JAVA_OPTS來實現。 例如,使用Cloud Foundry,您能夠將如下內容添加到您的manifest.yml中:

    ---
    env:
        JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n"
    複製代碼

    請注意,您不須要將address=NNNN選項傳遞給-Xrunjdwp。 若是省略,Java將簡單地選取一個隨機空閒端口。

    經過Internet調試遠程服務可能會很慢,您可能須要增長IDE中的超時時間。 例如,在Eclipse中,您能夠選擇JavaPreferences…``Debug並將debug timeout(ms)更改成更合適的值(在大多數狀況下,60000的效果很好)。

    在IntelliJ IDEA中使用遠程調試通道時,必須將全部斷點配置爲掛起線程而不是VM。 默認狀況下,IntelliJ IDEA中的斷點會暫停整個虛擬機,而不是僅掛起遇到斷點的線程。 這具備暫停管理遠程調試通道的線程的不良反作用,致使您的調試會話凍結。 在IntelliJ IDEA中使用遠程調試通道時,應將全部斷點配置爲掛起線程而不是VM。 請參閱IDEA-165769瞭解更多詳情。

2一、打包您的生產應用程序

  • 可執行的jars可用於生產部署。 因爲它們是獨立的,所以它們也很是適合基於雲的部署。
  • 對於額外的「生產就緒」功能,如健康,審計和度量REST或JMX端點; 考慮加入spring-boot-actuator。 有關詳細信息,請參閱第五部分「spring-boot-actuator:生產就緒功能」 。

2二、接下來讀什麼?

  • 您如今應該對如何使用Spring Boot以及您應該遵循的一些最佳實踐有很好的理解。 您如今能夠繼續深刻了解特定的Spring Boot功能,或者能夠跳過並閱讀Spring Boot的「生產就緒」部分。
相關文章
相關標籤/搜索