Spring Boot 官方文檔學習(一)入門及使用

我的說明:本文內容都是從爲知筆記上覆制過來的,樣式不免走樣,之後再修改吧。另外,本文能夠看做官方文檔的選擇性的翻譯(大部分),以及我的使用經驗及問題。html

其餘說明: 若是對Spring Boot沒有概念,請先移步上一篇文章 Spring Boot 學習。本篇本來是爲了深刻了解下Spring Boot而出現的。
另外,Spring Boot 仍然是基於Spring的,建議在趕完工以後深刻學習下Spring,有興趣能夠看看個人 Spring 4 官方文檔學習(十一)Web MVC 框架 。歡迎探討,笑~

目錄:
  1. 內置Servlet Container
  2. 使用Spring Boot
  3. 安裝Spring Boot CLI
  4. 開發一個簡單的Spring Boot應用--使用最原始的方式
    1. 建立一個文件夾
    2. 新建一個pom.xml文件
    3. 命令:mvn package
    4. 添加依賴
    5. 開始寫代碼
    6. 啓動項目
    7. 打包
    8. 執行
  5. Dependency Management
    1. 繼承 spring-boot-starter-parent
    2. 不繼承 spring-boot-starter-parent
  6. Starters
  7. 自動配置
  8. Spring Beans 和 依賴注入(略)
  9. @SpringBootApplication
  10. 運行Spring Boot Application
    1. 從IDE中運行
    2. 運行fat jar(executable jar)
    3. 使用Maven Plugin
    4. Hot swapping
  11. Developer tools
    1. Property defaults
    2. 自動重啓
    3. 熱加載 LiveReload
    4. 全局設置
    5. 遠程應用
      1. 遠程調試
  12. 生產打包

 
1、內置Servlet Container:
Name Servlet Version Java Version

Tomcat 8java

3.1web

Java 7+正則表達式

Tomcat 7spring

3.0apache

Java 6+瀏覽器

Jetty 9.3tomcat

3.1服務器

Java 8+網絡

Jetty 9.2

3.1

Java 7+

Jetty 8

3.0

Java 6+

Undertow 1.3

3.1

Java 7+

 
此外,你仍然能夠部署Spring Boot項目到任何兼容Servlet3.0+的容器。
2、使用Spring Boot。
    你能夠像使用標準的Java庫文件同樣使用Spring Boot。簡單的將須要的 spring-boot-*.jar 添加到classpath便可。
    Spring Boot不要求任何特殊的工具集成,因此可使用任何IDE,甚至文本編輯器。
 
    只是,仍然建議使用build工具:Maven 或 Gradle。
 
    Spring Boot依賴 使用 org.springframework.boot  groupId
    一般,讓你的Maven POM文件繼承 spring-boot-starter-parent,並聲明一個或多個 Starter POMs依賴便可。Spring Boot也提供了一個可選的 Maven Plugin來建立可執行的jars。   以下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>

    <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <!-- Package as an executable jar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
 
    須要注意的是, spring-boot-starter-parent 是一個很是好的方法,但並不適用於全部狀況。有時你須要繼承其餘的POM,或者你不喜歡默認的設置。-- 辦法見後面。
 
3、安裝Spring Boot CLI。
    這是一個命令行工具,能夠執行Groove腳本。是執行一個Spring Boot的最快途徑。
    -- 好吧,Linux下無敵,Win下仍是休息吧。
 
4、開發一個簡單的Spring Boot應用--使用最原始的方式。
    務必注意:前提是maven + jdk。
    一、建立一個文件夾。SpringBootSample01
    二、新建一個pom.xml文件。內容以下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>
    <!-- Additional lines to be added here... -->
</project>
    三、上面沒有添加任何依賴,但仍然能夠build。命令行:mvn package。注意,是當前路徑下 //SpringBootSample01/ 。
        固然,你也可使用IDE,不過使用文本編輯器會讓咱們對它更理解。
       
    四、如今須要添加依賴 -- 其實就是把依賴的jar添加到buildpath。
        因爲咱們已經繼承了 spring-boot-starter-parent ,而 spring-boot-starter-parent 又提供了 dependency-management ,因此咱們能夠忽略被選中依賴的版本。
        在添加依賴以前,咱們先看一下如今已有什麼:mvn dependency:tree。該命令會打印一個當前項目的依賴樹。
     
        結果代表,當前沒有任何依賴。 
 
        OK,如今咱們添加一個Starter 模塊。
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
   
        如今再次查看一下依賴樹。
  
        能夠看出,spring-boot-starter-web  包含了不少內容,spring-webmvc、spring-web、jackson、validation、tomcat、starter。
      五、如今就能夠開始寫代碼了。
        因爲Maven默認編譯路徑爲 src/main/java 下面的源碼,因此,默認設置下,須要建立這些文件夾。        
        而後,編寫文件 src/main/java/Example.java:
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }
}
        這裏咱們只須要關心 @EnableAutoConfiguration 便可。這個註解是讓Spring Boot 猜想 你想怎麼配置Spring,但實際上,它是根據你添加到classpath中的依賴來判斷的。
        注意,自動配置 能夠配合 Starter POMs 一塊兒工做,但兩者不是捆綁到一塊兒的。你仍然能夠將Starter POMs中的依賴單獨揀出使用,Spring Boot仍是會自動配置。
        六、啓動項目。因爲咱們使用了 spring-boot-starter-parent POM,因此可使用 mvn spring-boot:run來啓動項目(根路徑)。
            啓動以後就能夠訪問了,默認地址:  http://localhost:8080/
        七、打包。executable jars 又稱 fat jars,是能夠直接在生產環境中運行的,包含全部編譯生成的class文件以及依賴包。
            注意,Spring Boot的這種打包方式須要使用Spring Boot提供的 spring-boot-maven-plugin 。         
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
            注意,spring-boot-starter-parent POM中包含了 <executions> 的配置信息,綁定了 repackage goal (maven)。若是你不使用parent POM,你須要本身來聲明這個配置信息。
            如今,能夠打包了: mvn package 。
           
            如今,你能夠在/target目錄下看到 myproject-0.0.1-SNAPSHOT.jar ,大約10 Mb左右。能夠經過 jar tvf target/myproject-0.0.1-SNAPSHOT.jar 來查看其中的內容。
            此外,在/target目錄下,還能夠看到 myproject-0.0.1-SNAPSHOT.jar.original ,這是Maven打包出來的---在Spring Boot repackage 以前。
            八、執行。正常的jar執行:java -jar target/myproject-0.0.1-SNAPSHOT.jar  ,啓動信息以下:
           
            執行 ctrl+c,退出。
5、Dependency Management
每一個版本的Spring Boot都提供了一個依賴列表。這個列表包含了你可能經過Spring Boot用到的全部的Spring模塊以及第三方庫。該列表能夠以 BOM(Bills of Material)的形式支持Maven。 ---  怎麼理解BOM和Starter?什麼區別??
 
一、繼承 spring-boot-starter-parent
      spring-boot-starter-parent project 
      默認是 Java 1.6。 Resource filtering。exec plugin、surefire、Git commit ID、shade。
      Resource filtering for application.properties 和 application.yml,以及,profile-specific file,如application-foo.properties 或 application-foo.yml。
      -- 注意Maven filtering使用 @..@ 佔位符,你能夠在Maven property中覆蓋:resource.delimiter。
 
       若是不想使用Spring Boot中的默認版本,能夠在<properties>覆蓋相應的版本,如,想使用不一樣版本的Spring Data,具體以下:
<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
       想使用不一樣版本的JDK
<!-- 使用 java 1.8 -->
<java.version>1.8</java.version>
 
二、不繼承 spring-boot-starter-parent
這種狀況下,仍然可使用dependency management,但不能使用plugin management啦。方式以下:
<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.4.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
注意,scope是 import 。並且,這種狀況下,再也不容許在<properties>覆蓋相應的版本。若是要使用其餘版本,須要在上面的前面添加一個完整的dependency。以下:
<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.4.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

 

另外,Spring Boot還提供了一個Maven Plugin:spring-boot-maven-plugin,用於將項目打包成fat jar(executable jar)。
繼承時只須要 聲明一下便可使用:
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

 

6、Starters
能夠建立本身的Starter,但名字格式不能是 spring-boot-starter-*,而是 *-spring-boot-starter。相似Maven插件的規則。
 
7、自動配置
@Import 和 @ComponentScan 相似;
@EnableAutoConfiguration 和 @SpringBootApplication 相似;---注意,只能使用一次,建議用在primary @Configuration class上。
 
注意,自動配置永遠是第二位的,一旦你配置本身的東西,那自動配置的就會被覆蓋。
查看自動配置都配置了什麼,以及爲何,啓動應用的時候加上 --debug便可。
禁用特定的自動配置:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
若是class不在classpath中,可使用  excludeName,而後使用全路徑便可。
 
8、Spring Beans 和 依賴注入。
9、@SpringBootApplication
@SpringBootApplication 等同於默認的屬性的 @Configuration,  @EnableAutoConfiguration and @ComponentScan。 
-- 注意,@ComponentScan 不能憑空使用。
  
10、運行Spring Boot Application
一、從IDE中運行
須要導入現有Maven項目。
若是不當心運行了兩次,出現端口占用問題,STS(Spring Tools Suite)使用Relaunch便可。
 
二、運行fat jar(executable jar)
java -jar target/xxxx.jar    注意,是在項目路徑下執行。
開啓 遠程調試支持
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myproject-0.0.1-SNAPSHOT.jar

 

三、使用Maven Plugin
  1. mvn spring-boot:run
四、Hot swapping   熱部署??? 好像不是,是熱加載。
由於Spring Boot應用都是簡單的Java應用,因此JVM Hot-swapping能夠直接使用。可是,JVM Hot-swapping對於可以替換的字節碼有些限制,因此建議使用JRebel或者Spring Loaded??
spring-boot-devtools 模塊一樣包含了快速重啓應用的支持。
另外,貌似JVM Hot-swapping 只能在debug期間修改方法體??    
 
11、Developer tools
Spring Boot包含一組附加的開發期工具。
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
注意,生產環境下(java -jar或者經過特定的類加載器啓動),這些開發工具自動被禁止。
上面的 <optional>true</optional> 是一個最佳實踐,能夠有效阻止用於其餘模塊。
若是想確保生產Build中不包含devtools,可使用excludeDevtools build property。
 
一、Property defaults
一些Spring Boot支持的庫使用了cache增進性能。可是cache,在開發過程當中可能會是一個阻礙。例如你沒法當即更新一個模板(thymeleaf的)。
cache設置一般在 application.properties 中。可是,比起手動設置這些,spring-boot-devtools模塊會自動應用這些開發期的設置。
 
二、自動重啓
使用spring-boot-devtools模塊的應用,當classpath中的文件有改變時,會自動重啓! -- 就是說,默認會監視classpath入口。
靜態資源和視圖模板不須要重啓!
注意,不一樣的IDE有不一樣的表現,例如Eclipse中只要改變了文件並保存,那就會致使classpath中的內容改變。而Intellij IDEA則須要 Build #Make Project。
能夠經過build plugin啓動應用,只要開啓了forking支持,由於Devtools須要一個隔離的classloader才能運行正常。Maven下要這樣開啓:
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>
注意:在使用LiveReload(熱加載)時,自動重啓仍然能夠正常工做。若是你使用了JRebel,自動重啓會被禁用以支持動態類加載。此時,devtools其餘方面仍然可使用。
注意:DevTools在重啓過程當中依賴應用上下文的shutdown hook來關掉它(應用)。因此若是禁用了shutdown hook,它就沒法正常工做了:SpringApplication.setRegisterShutdownHook(false)。
 
Spring Boot使用的重啓技術,其實是使用了兩個類加載器:不變的base類加載器、可變的restart類加載器。前者加載第三方jar之類的。後者加載項目代碼。重啓的時候,只是丟棄可變的restart類加載器,而後從新建立一個,因此速度比較快。
若是你以爲這樣仍然不夠快,或者遇到了類加載器問題,那你能夠考慮JRebel之類的重加載技術。(重寫了類??)
Spring Loaded項目提供了另外一個選擇,可是支持的框架不夠多,且沒有商業支持。
 
一些特定的資源改變時沒有必要引發重啓。有一些不會引發重啓,可是會重加載。若是你想自定義的設置一下,可使用 spring.devtools.restart.exclude 屬性。以下:
spring.devtools.restart.exclude=static/**,public/**
若是想在默認的設置以外 再添加新的排除選項,可使用 spring.devtools.restart.additional-exclude 屬性。
 
若是想在修改classpath以外的文件時也讓應用重啓,可使用 spring.devtools.restart.additional-paths 屬性。還能夠配合上面提到的 spring.devtools.restart.exclude 屬性,來控制是重啓仍是重加載。
 
若是不想使用自動重啓功能,可使用 spring.devtools.restart.enabled 屬性。多數狀況下,能夠在 application.properties 中設置,這樣 仍然會建立一個restart類加載器,但再也不監視改變。
若是想徹底禁止自動重啓,須要在調用 SpringApplication.run(..) 以前設置一個System屬性。以下:
public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}
 
若是你的IDE會隨改隨編譯,你可能會傾向於只在特定時刻引起重啓(不然會很煩人,並且性能降低)。這時,你可使用「trigger file」,就是一個特定的文件,只有修改這個文件時纔會觸發重啓。使用 spring.devtools.restart.trigger-file 屬性便可。(還能夠設置爲全局屬性,這樣全部的項目均可以使用了!見十八。)
 
自定義restart類加載器。
若是有一個多模塊項目,只有部分導入到你的IDE中,你可能須要自定義一下。首先建立一個文件:META-INF/spring-devtools.properties。該文件中,能夠有之前綴 restart.exclude.restart.include. 開頭的屬性。前者會被放入base類加載器,後者則被放入restart類加載器。
該屬性的value,是正則表達式。例如:
restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
注意,key只要是前綴 restart.exclude. 和 restart.include. 開頭便可, 後綴任意
 
已知限制:
自動重啓,在使用 ObjectInputStream 反序列化時,會出問題。若是你想使用反序列化,應該使用Spring的 ConfigurableObjectInputStream 配合 Thread.currentThread().getContextClassLoader() 使用。
惋惜的是,一些第三方jars中沒有考慮到這個問題,無解。
 
三、熱加載 LiveReload
spring-boot-devtools 模塊內置了一個 LiveReload Server,能夠保證在改變資源時 瀏覽的刷新。LiveReload的瀏覽器擴展,免費支持Chrome、Firefox、Safari。
若是想禁用: spring.devtools.livereload.enabled=false   。
注意:只能運行 一個LiveReload Server。若是同時開啓多個項目,那只有第一個。
 
四、全局設置(前面有提到)
$HOME 文件夾下添加一個文件 .spring-boot-devtools.properties ,該文件中的內容會被做用於全部的Spring Boot項目。例如設置 觸發文件
spring.devtools.reload.trigger-file=.reloadtrigger
 
五、遠程應用
Spring Boot 的developer tools也能夠在遠程使用(應該是使用一部分)。須要開啓支持。例如:
spring.devtools.remote.secret=mysecret
問題:值是什麼意思?
注意:不要在生產環境下開啓!!
 
遠程devtools支持是成對出現的。服務器端+客戶端。當設置了上面的屬性時,服務器端會自動開啓。
 
運行遠程客戶端應用:
運行 org.springframework.boot.devtools.RemoteSpringApplication ,須要使用和遠程項目相同的classpath!
傳遞給應用的non-option參數應該是你要鏈接到的URL。( 問題,什麼是non-option參數?
例如,你在使用Eclipse或者STS,有一個項目 my-app ,部署到了Cloud Foundry,那你須要進行以下操做:
  1. Select Run -> Run Configurations...
  2. Create a new Java Application "launch configuration"
  3. Browse for the my-app project
  4. Use org.springframework.boot.devtools.RemoteSpringApplication as the main class.
  5. Add https://myapp.cfapps.io to the Program arguments (or whatever your remote URL is).
 
代理訪問遠程的設置方法(略)。p47(60/346)
 
遠程方式下,客戶端的任何更新都會被push到服務器端,並按設置觸發restart。比較快。
 
5.一、遠程調試
並不老是能開啓Java遠程調試功能。(直接翻譯的,略拗口。其實就是有時候能開啓,有時候不能)
爲了改進這些限制,devtools支持Http協議的遠程調試通道。遠程客戶端提供了一個本地服務器(默認8000端口,可修改),用於綁定遠程調試器。當一個鏈接被建立時,debug信息就會經過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"
注意,經過網絡進行遠程調試,可能很慢,因此你須要增長超時時間。Eclipse中:Java -> Debug -> Debugger timeout (ms),設成60000很不錯。
 
 
12、生產打包
Executable jars能夠直接在生產環境下使用。
其餘的生產就緒功能,例如監控等,能夠考慮 spring-boot-actuator 。後面會有介紹。
 
 
 
 
相關文章
相關標籤/搜索