Spring Boot實戰(zhàn)

第1章 入門

1.1 Spring風云再起

1.1.1 重新認識Spring

1.1.2 Spring Boot精要

四個核心:

  • 自動配置:針對很多Spring應用程序常見的應用功能,Spring Boot能自動提供相關(guān)配置胸哥。
  • 起步依賴:告訴Spring Boot需要什么功能板甘,他就能引入需要的庫。
  • 命令行界面:這是Spring Boot的可選特性酒甸,借此你只需寫代碼就能完成完整的應用程序堆巧,無需傳統(tǒng)項目構(gòu)建。
  • Actuator:讓你能夠深入運行中的Spring Boot應用程序牍颈,一探究竟迄薄。

1.1.3 Spring Boot不是什么

  1. Spring Boot不是應用服務器,只是嵌入了Servlet容器煮岁。
  2. Spring Boot沒有實現(xiàn)諸如JPA或JMS之類的企業(yè)級Java規(guī)范讥蔽,不過它自動配置了某個JPA實現(xiàn)的Bean,以此支持JPA人乓。
  3. Spring Boot沒有引入任何形式的代碼生成勤篮,而是利用了Spring 4的條件化配置特性,
    以及Maven和Gradle提供的傳遞依賴解析色罚,以此實現(xiàn)Spring應用程序上下文里的自動配置碰缔。

1.2 Spring Boot入門

1.2.1 安裝Spring Boot CLI

Spring Boot CLI有好幾種安裝方式:

  • 用下載的分發(fā)包進行安裝
  • 用Groovy Environment Manager進行安裝
  • 通過OS X Homebrew進行安裝
  • 使用MacPorts進行安裝

1.2.2 使用Spring Initializr初始化Spring Boot項目

Spring Initializr有幾種用法:

  • 通過Web界面使用
  • 通過Spring Tool Suite使用
  • 通過IntelliJ IDEA使用
  • 使用Spring Boot CLI使用
  1. 使用Spring Initializr的Web界面
    http://start.spring.io
  2. 在Spring Tool Suite里創(chuàng)建Spring Boot項目
  3. 在IntelliJ IDEA里創(chuàng)建Spring Boot項目
  4. 在Spring Boot CLI里使用Initializr

1.3 小結(jié)

第2章 開發(fā)第一個應用程序

2.1 運用Spring Boot

2.1.1 查看初始化的Spring Boot新項目

@SpringBootApplication將三個有用的注解組合在一起:

  • Spring的@Configuration
  • Spring的@ComponentScan
  • Spring Boot的@EnableAutoConfiguration

2.1.2 Spring Boot項目構(gòu)建過程解析

Spring Boot為Gradle和Maven提供了構(gòu)建插件,以便輔助構(gòu)建Spring Boot項目戳护。

要是選擇用Maven來構(gòu)建應用程序金抡, Initializr會替你生成一個pom.xml文件,其中
使用了Spring Boot的Maven插件腌且。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>{springBootVersion}</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

pom.xml里的<dependency>沒有指定版本梗肝。

2.2 使用起步依賴

只在構(gòu)建文件里指定這些功能,讓構(gòu)建過程自己搞明白我們要什么東西铺董,這正是Spring Boot起步依賴的功能巫击。

2.2.1 指定基于功能的依賴

Spring Boot通過提供眾多起步依賴降低項目依賴的復雜度。起步依賴本質(zhì)上是一個Maven項
目對象模型(Project Object Model精续, POM)坝锰,定義了對其他庫的傳遞依賴,這些東西加在一起即
支持某項功能重付。很多起步依賴的命名都暗示了它們提供的某種或某類功能顷级。

我們并不需要指定版本號,起步依賴本身的版本是由正在使用的Spring Boot的版本來決定
的确垫,而起步依賴則會決定它們引入的傳遞依賴的版本弓颈。

查看依賴樹:

gradle dependencies
mvn dependency:tree

2.2.2 覆蓋起步依賴引入的傳遞依賴

Gradle

compile("org.springframework.boot:spring-boot-starter-web") {
    exclude group: 'com.fasterxml.jackson.core'
}

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
        </exclusion>
    </exclusions>
</dependency>

2.3 使用自動配置

2.3.1 專注于應用程序功能

2.3.2 運行應用程序

2.3.3 剛剛發(fā)生了什么

Spring條件化配置:實現(xiàn)Condition接口,覆蓋它的matches()方法删掀。

2.4 小結(jié)

起步依賴幫助你專注于應用程序需要的功能類型翔冀,而非提供該功能的具體版本。與此同時爬迟,自動配置把你從樣板式的配置中解放了出來橘蜜。這些配置在沒有Spring Boot的Spring應用程序里非常常見。

第3章 自定義配置

兩種影響自動配置的方式——使用顯式配置進行覆蓋和使用屬性進行精細化配置

3.1 覆蓋Spring Boot自動配置

3.1.1 保護應用程序

compile("org.springframework.boot:spring-boot-starter-security")

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

用戶名:user,密碼:在打印日志中

3.1.2 創(chuàng)建自定義的安全配置

3.1.3 掀開自動配置的神秘面紗

3.2 通過屬性文件外置配置

Spring Boot自動配置的Bean提供了300多個用于微調(diào)的屬性计福。

Spring Boot應用程序有多種設置途徑跌捆。Spring Boot能從多種屬性源獲得屬性,包括如下幾處:

  1. 命令行參數(shù)
  2. java:comp/env里的JNDI屬性
  3. JVM系統(tǒng)屬性
  4. 操作系統(tǒng)環(huán)境變量
  5. 隨機生成的帶random.*前綴的屬性(在設置其他屬性時象颖,可以引用它們佩厚,比如${random.long})
  6. 應用程序以外的application.properties或者application.yml文件
  7. 打包在應用程序內(nèi)的application.properties或者application.yml文件
  8. 通過@PropertySource標注的屬性源
  9. 默認屬性

這個列表按照優(yōu)先級排序

application.properties和application.yml文件能放在以下四個位置:

  1. 外置,在相對于應用程序運行目錄的/config子目錄里
  2. 外置说订,在應用程序運行的目錄里
  3. 內(nèi)置抄瓦,在config包內(nèi)
  4. 內(nèi)置,在Classpath根目錄

這個列表按照優(yōu)先級排序

如果在同一優(yōu)先級位置同時有application.properties和application.yml陶冷,那么==application. yml里的屬性會覆蓋application.properties里的屬性==钙姊。(==寫反了?==)

3.2.1 自動配置微調(diào)

禁用模板緩存
spring.thymeleaf.cache=false

配置嵌入式服務器
server.port=8080

HTTPS服務:

用JDK的keytool工具來創(chuàng)建一個密鑰存儲(keystore)

server.port = 8443
server.ssl.key-store = classpath:mykeys.jks
server.ssl.key-store-password = 123456
server.ssl.key-password = 123456

配置日志

配置數(shù)據(jù)源

3.2.2 應用程序Bean的配置外置

Spring Boot的屬性解析器會自動把駝峰規(guī)則的屬性和使用連字符或下劃線的同名屬性關(guān)聯(lián)起來埂伦。

3.2.3 使用Profile進行配置

@Profile

設置spring.profiles.active屬性就能激活Profile煞额,任意設置配置屬性的方式都能用于設置這個值。

3.3 定制應用程序錯誤頁面

第4章 測試

Spring的SpringJUnit4ClassRunner可以在基于Junit的應用程序測試里加載Spring應用程序上下文沾谜。

  1. 使用特定于Profile的屬性文件
    使用application.properties可以創(chuàng)建額外的屬性文件膊毁,遵循application-{profile}.properties這種命名格式,就能提供特定于Profile的屬性基跑。
  2. 使用多Profile YAML文件進行配置
    如果使用YAML來配置屬性婚温,則可以遵循與配置文件相同的命名規(guī)范,即創(chuàng)建application-
    {profile}.yml這樣的YAML文件,并將與Profile無關(guān)的屬性繼續(xù)放在application.yml里。
    但既然用了YAML蚂维,就可以把所有Profile的配置屬性都放在一個application.yml文件里。
    使用一組三個連字符(---)作為分隔符嵌巷。

4.1 集成測試自動配置

在大多數(shù)情況下,為Spring Boot應用程序編寫測試時應該用@SpringApplicationConfiguration代替@ContextConfiguration室抽。

4.2 測試Web應用程序

兩個方案:

  • Spring Mock MVC
  • Web集成測試

4.2.1 模擬Spring MVC

要在測試里設置Mock MVC,可以使用MockMvcBuilders靡努,該類提供了兩個靜態(tài)方法坪圾。

  • standaloneSetup():構(gòu)建一個Mock MVC,提供一個或多個手工創(chuàng)建并配置的控制器惑朦。
  • webAppContextSetup():使用Spring應用程序上下文來構(gòu)建Mock MVC兽泄,該上下文里
    可以包含一個或多個配置好的控制器。

兩者的主要區(qū)別在于漾月, standaloneSetup()希望你手工初始化并注入你要測試的控制器病梢,
而webAppContextSetup()則基于一個WebApplicationContext的實例,通常由Spring加載。
前者同單元測試更加接近蜓陌,你可能只想讓它專注于單一控制器的測試觅彰,而后者讓Spring加載控制
器及其依賴,以便進行完整的集成測試钮热。

4.2.2 測試Web安全

經(jīng)過身份驗證的請求又該如何發(fā)起呢填抬? Spring Security提供了兩個注解。

  • @WithMockUser:加載安全上下文隧期,其中包含一個UserDetails飒责,使用了給定的用戶名、
    密碼和授權(quán)仆潮。
  • @WithUserDetails:根據(jù)給定的用戶名查找UserDetails對象宏蛉,加載安全上下文。

4.3 測試運行中應用程序

@WebIntegrationTest

4.3.1 用隨機端口啟動服務器

@SpringApplicationConfiguration和@WebIntegrationTest已經(jīng)被@SpringBootTest替代性置。

4.3.2 使用Selenium測試HTML頁面

testCompile("org.seleniumhq.selenium:selenium-java:2.45.0")

第5章 Spring Boot CLI

Spring Boot CLI施展了很多技能拾并。

  • CLI可以利用Spring Boot的自動配置和起步依賴。
  • CLI可以檢測到正在使用的特定類蚌讼,自動解析合適的依賴庫來支持那些類辟灰。
  • CLI知道多數(shù)常用類都在哪些包里,如果用到了這些類篡石,它會把那些包加入Groovy的默認
    包里芥喇。
  • 應用自動依賴解析和自動配置后, CLI可以檢測到當前運行的是一個Web應用程序凰萨,并自
    動引入嵌入式Web容器(默認是Tomcat)供應用程序使用继控。

第7章 深入Actuator

7.1 揭秘Actuator的端點

Actuator的端點

HTTP方法 路 徑 描 述
GET /autoconfig 提供了一份自動配置報告,記錄哪些自動配置條件通過了胖眷,哪些沒通過
GET /configprops 描述配置屬性(包含默認值)如何注入Bean
GET /beans 描述應用程序上下文里全部的Bean武通,以及它們的關(guān)系
GET /dump 獲取線程活動的快照
GET /env 獲取全部環(huán)境屬性
GET /env/{name} 根據(jù)名稱獲取特定的環(huán)境屬性值
GET /health 報告應用程序的健康指標,這些值由HealthIndicator的實現(xiàn)類提供
GET /info 獲取應用程序的定制信息珊搀,這些信息由info打頭的屬性提供
GET /mappings 描述全部的URI路徑冶忱,以及它們和控制器(包含Actuator端點)的映射關(guān)系
GET /metrics 報告各種應用程序度量信息,比如內(nèi)存用量和HTTP請求計數(shù)
GET /metrics/{name} 報告指定名稱的應用程序度量值
POST /shutdown 關(guān)閉應用程序境析,要求endpoints.shutdown.enabled設置為true
GET /trace 提供基本的HTTP請求跟蹤信息(時間戳囚枪、 HTTP頭等)

7.2 連接Actuator的遠程shell

Gradle:

compile("org.springframework.boot:spring-boot-starter-remote-shell")

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>

ssh user@localhost -p 2000

密碼在日志中

第8章 部署Spring Boot應用程序

8.1 衡量多種部署方式

Spring Boot應用程序有多種構(gòu)建和運行方式:

  • 在IDE中運行應用程序(涉及Spring ToolSuite或IntelliJ IDEA)。
  • 使用Maven的spring-boot:run或Gradle的bootRun劳淆,在命令行里運行链沼。
  • 使用Maven或Gradle生成可運行的JAR文件,隨后在命令行中運行沛鸵。
  • 使用Spring Boot CLI在命令行中運行Groovy腳本括勺。
  • 使用Spring Boot CLI來生成可運行的JAR文件,隨后在命令行中運行。

8.2 部署到應用服務器

8.2.1 構(gòu)建WAR文件

Gradle:

apply plugin: 'war'

war {
    baseName = 'test'
    version = '0.0.1-SNAPSHOT'
    archiveName = 'demo.war'
}

archiveName:打包后的包名

Maven:
<packaging>war</packaging>

要使用SpringBootServletInitializer疾捍,只需創(chuàng)建一個子類奈辰,覆蓋configure()方法
來指定Spring配置類。

public class TestServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Ch08DeployApplication.class);
    }
}

構(gòu)建命令:

gradle build

mvn package

如果沒有刪除Application里的main()方法拾氓,構(gòu)建過程生成的WAR文件仍可直接運行,一如可執(zhí)行的JAR文件:

java -jar readinglist-0.0.1-SNAPSHOT.war

這樣一來咙鞍,同一個部署產(chǎn)物就能有兩種部署方式了房官!

如果war包放在外部容器中運行,需要使用SpringBootServletInitializer续滋,如果通過java -jar運行則不需要翰守。

Spring Boot開發(fā)者工具

compile "org.springframework.boot:spring-boot-devtools"
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

自動重啟

IDEA不能自動重啟的解決辦法:
http://blog.csdn.net/u012410733/article/details/54316548

可以設置spring.devtools.restart.exclude屬性來覆蓋默認的重啟排除目錄。

如果想徹底關(guān)閉自動重啟疲酌,可以將spring.devtools.restart.enabled設置
為false蜡峰。

還可以設置一個觸發(fā)文件,必須修改這個文件才能觸發(fā)重啟朗恳。只需設置spring.devtools.restart.triggerfile屬性湿颅。

全局配置開發(fā)者工具

可以在主目錄(home directory)里創(chuàng)建一個名為.spring-boot-devtools.
properties的文件。(請注意粥诫,文件名用“ .”開頭油航。)

要是想覆蓋這些配置,可以在每個項目的application.properties或application.yml文件里設置
特定于每個項目的屬性怀浆。

Spring Boot依賴

如果你正在使用的起步依賴沒有覆蓋到某個庫谊囚,而你需要使用這個庫,
那就得在Maven或Gradle的構(gòu)建說明里顯式地聲明這個依賴执赡。

請注意镰踏,在這兩種情況下,都不需要指定版本號沙合, Spring Boot的依賴管理會替你處理這個問
題的奠伪。但是,如果想覆蓋Spring Boot選擇的版本首懈,你也可以顯式地提供一個版本號芳来。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猜拾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佣盒,老刑警劉巖挎袜,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡盯仪,警方通過查閱死者的電腦和手機紊搪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來全景,“玉大人耀石,你說我怎么就攤上這事“只疲” “怎么了滞伟?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炕贵。 經(jīng)常有香客問我梆奈,道長,這世上最難降的妖魔是什么称开? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任亩钟,我火速辦了婚禮,結(jié)果婚禮上鳖轰,老公的妹妹穿的比我還像新娘清酥。我一直安慰自己,他們只是感情好蕴侣,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布焰轻。 她就那樣靜靜地躺著,像睡著了一般睛蛛。 火紅的嫁衣襯著肌膚如雪鹦马。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天忆肾,我揣著相機與錄音荸频,去河邊找鬼。 笑死客冈,一個胖子當著我的面吹牛旭从,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播场仲,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼和悦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渠缕?” 一聲冷哼從身側(cè)響起鸽素,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亦鳞,沒想到半個月后馍忽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棒坏,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年遭笋,在試婚紗的時候發(fā)現(xiàn)自己被綠了坝冕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓦呼,死狀恐怖喂窟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情央串,我是刑警寧澤磨澡,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蹋辅,受9級特大地震影響钱贯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侦另,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一秩命、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褒傅,春花似錦弃锐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至支竹,卻和暖如春旋廷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背礼搁。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工饶碘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馒吴。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓扎运,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饮戳。 傳聞我的和親對象是個殘疾皇子豪治,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容