Spring Boot

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

Tomcat 8html

3.1java

Java 7+web

Tomcat 7正則表達式

3.0spring

Java 6+apache

Jetty 9.3瀏覽器

3.1tomcat

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 。後面會有介紹。
相關文章
相關標籤/搜索