第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不是什么
- Spring Boot不是應用服務器,只是嵌入了Servlet容器煮岁。
- Spring Boot沒有實現(xiàn)諸如JPA或JMS之類的企業(yè)級Java規(guī)范讥蔽,不過它自動配置了某個JPA實現(xiàn)的Bean,以此支持JPA人乓。
- 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使用
- 使用Spring Initializr的Web界面
http://start.spring.io - 在Spring Tool Suite里創(chuàng)建Spring Boot項目
- 在IntelliJ IDEA里創(chuàng)建Spring Boot項目
- 在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能從多種屬性源獲得屬性,包括如下幾處:
- 命令行參數(shù)
- java:comp/env里的JNDI屬性
- JVM系統(tǒng)屬性
- 操作系統(tǒng)環(huán)境變量
- 隨機生成的帶random.*前綴的屬性(在設置其他屬性時象颖,可以引用它們佩厚,比如${random.long})
- 應用程序以外的application.properties或者application.yml文件
- 打包在應用程序內(nèi)的application.properties或者application.yml文件
- 通過@PropertySource標注的屬性源
- 默認屬性
這個列表按照優(yōu)先級排序
application.properties和application.yml文件能放在以下四個位置:
- 外置,在相對于應用程序運行目錄的/config子目錄里
- 外置说订,在應用程序運行的目錄里
- 內(nèi)置抄瓦,在config包內(nèi)
- 內(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應用程序上下文沾谜。
- 使用特定于Profile的屬性文件
使用application.properties可以創(chuàng)建額外的屬性文件膊毁,遵循application-{profile}.properties這種命名格式,就能提供特定于Profile的屬性基跑。 - 使用多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選擇的版本首懈,你也可以顯式地提供一個版本號芳来。