Spring Boot是微服務(wù)架構(gòu)的基礎(chǔ)。相比以前的Spring,它主要是省去了大量的樣板式配置,取而代之的是根據(jù)條件的自動化配置,也提升了開發(fā)體驗和增加一些新的特性,使開發(fā)人員把更多的精力放到業(yè)務(wù)代碼上。所以,對于Spring Boot的學(xué)習(xí)主要是了解Spring Boot的開發(fā)方式,深入一點,就是了解其內(nèi)部的自動配置等特性。
起步
Spring Boot的初始項目可以通過三種方式來創(chuàng)建。
- 通過start.spring.io 來可視化創(chuàng)建項目,填寫項目構(gòu)建方式(Maven/Gradle)以及項目相關(guān)信息和項目包含的模塊,下載到本地后直接用IDE打開即可。
- 下載專用IDESpring Tool Suite ,點擊File->new->Spring Start Project即可進(jìn)入新建Spring Boot項目流程。
- 通過Spring Boot CLI 命令行工具來構(gòu)建項目,此種方式需要用到Groovy語言。此方式本文暫不討論。
?除了Spring Boot CLI通過寫少量Groovy腳本即可通過CLI來自動推斷需要哪些包并自動引入和配置外,其它兩種方式都需要手動來選擇或配置項目所需模塊。以如圖:
??在上面的列表中,可以根據(jù)我們所需來自由選擇依賴項,例如,如果是web開發(fā),需要勾選web就可以;如果需要數(shù)據(jù)持久化,可以勾選JPA或MyBatis等。在嘗試用Spring Boot做web開發(fā)的初始階段,建議選擇web(SpringMvc),JPA/Mybatis(持久化),H2(嵌入式數(shù)據(jù)庫),thymeleaf(模板引擎)。創(chuàng)建完成項目后若是Maven構(gòu)建方式,打開Pom.xml文件就會發(fā)現(xiàn),這一整套能夠開發(fā)出簡單應(yīng)用的項目所需的依賴非常少,只有我們所選擇的依賴項,并且沒有了那么多的配置文件,只有一個application.properties配置文件。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
這就體現(xiàn)出Spring Boot的兩個好處:自動配置,起步依賴。
- 自動配置:所有的配置都不是在配置文件中顯示聲明,而是根據(jù)項目中是否有某個包的依賴在代碼中自動完成配置,如果沒有則忽略。Spring Boot所支持的自動配置依賴列表在
spring-boot-autoconfiger.jar
包中查看,在項目中如果遇到Spring Boot沒有實現(xiàn)的第三方依賴自動配置,可以參照其中的代碼來自定義實現(xiàn)。也可以擴(kuò)展其已有的配置類,重寫其中的configure方法來覆蓋默認(rèn)的自動配置。 - 起步依賴:Spring Boot通過提供起步依賴降低項目依賴的復(fù)雜度。起步依賴本質(zhì)上是一個Maven項目對象模型(Project Object Model,POM),定義了對其它庫的傳遞依賴,使這些庫加在一起支持某項功能。起步依賴一般都會以
spring-boot-start-
開頭。例如web的起步依賴是spring-boot-start-web
其傳遞依賴有org.springframework:spring-web,org.springframework:spring-webmvc,com.fasterxml.jackson.core:jackson-databind
等依賴項。其中各個依賴項的版本都是經(jīng)過Spring Boot測試的沒有兼容問題的版本。然而在實際開發(fā)中會有某些情況需要自己來控制某個傳遞依賴的版本,比如上面com.fasterxml.jackson.core:jackson-databind
修復(fù)了某個bug的版本,這種情況在Pom.xml中可以通過添加指定版本號的該依賴項的形式來覆蓋默認(rèn)的傳遞依賴引用:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>3.2.1</version>
</dependency>
至此,一個簡單Spring Boot項目已經(jīng)完成,我們可以像以往一樣直接開始寫業(yè)務(wù)代碼,如創(chuàng)建實體類,寫Controller,添加視圖等等。在寫完代碼后,Spring Boot的運(yùn)行方式有兩種:
- 直接在IDE中debug(本人用的是Spring Tool Suite,運(yùn)行方式是項目->DebugAs->Spring Boot App)。也可以在Pom.xml中把jar改成war,在tomcat中運(yùn)行。
- 執(zhí)行maven install操作,會在項目根目錄的target文件夾內(nèi)生成demo.jar可執(zhí)行程序,通過
java -jar demo.jar
運(yùn)行即可
?以上兩種方式運(yùn)行后可以在瀏覽器中輸入localhost:8080
來訪問你的web程序。
通過屬性文件(application.properties)外置配置
Spring Boot自動配置的Bean提供了300多個用于微調(diào)的屬性。當(dāng)調(diào)整設(shè)置時,只需要在環(huán)境變量、java系統(tǒng)屬性、命令行參數(shù)或?qū)傩晕募镞M(jìn)行指定就可以了。其中,屬性文件有兩種文件格式,一種就是我們看見的默認(rèn)的application.properties
,一種是application.yml
。
?以配置服務(wù)啟動的端口為例,兩種配置文件的格式分別為(server.port設(shè)置為0的作用是在啟動時會選擇一個可用的隨機(jī)端口,這樣能避免端口沖突):
application.properties
server.port=0
application.yml
server:
port:0
同時,也可以像以前一樣將應(yīng)用程序所需的自定義配置寫到屬性配置文件中,而且更方便。例如,我們要把項目名稱等相關(guān)信息寫到配置文件中可以這樣寫
project.Name='新項目'
project.Company='***公司'
然后,在項目中寫一個對應(yīng)的Bean,Bean加上@ConfigurationProperties("project")
注解,就可以實現(xiàn)將帶有project前綴的配置加載到對應(yīng)屬性中,代碼如下:
@Component
@ConfigurationProperties("project")
public class ProjectProperties{
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
………………………………
}
這樣,在所需要的地方可以直接注入這個Bean來方便使用配置中的屬性了。
?Spring Boot的屬性配置文件也可以通過Spring.profiles.active屬性來激活指定的配置文件,以實現(xiàn)在不同環(huán)境使用不同配置文件,如果使用application.properties
屬性文件,則額外配置文件的命名規(guī)則為application-{profile}.properties
。例如,設(shè)置Spring.profiles.active=product,則額外配置文件名字為application-product.properties
,這樣在程序運(yùn)行時會自動讀取application-product.properties
文件的配置屬性。Profile在Spring3.1版本就已經(jīng)有,但是在Spring Boot中使用更為方便。
Actuator
Actuator提供很多生產(chǎn)級特性,比如監(jiān)控和度量Spring Boot應(yīng)用。使用方法就是直接添加起步依賴 spring-boot-starter-actuator
或在創(chuàng)建項目時勾選Actuator。Actuator暴露的接口可以提供很多Spring Boot各種信息以及運(yùn)行狀態(tài)、所使用資源以及空閑資源等,也可以用來控制Spring Boot應(yīng)用關(guān)閉等操作。也可以通過它來查看Spring Boot所做的自動配置信息。
?比如,在Spring Boot運(yùn)行時,通過瀏覽器訪問localhost:8080/health
就會得到應(yīng)用是否運(yùn)行的狀態(tài):
{"status":"UP"}
輸入localhost:8080/metrics
就會得到各種應(yīng)用程序度量信息,比如內(nèi)存用量和HTTP請求次數(shù)等:
{
"mem": 330481,
"mem.free": 103166,
"processors": 8,
"instance.uptime": 4087,
"uptime": 7873,
"systemload.average": -1.0,
"heap.committed": 268800,
"heap.init": 131072,
"heap.used": 165633,
"heap": 1849856,
"nonheap.committed": 62720,
"nonheap.init": 2496,
"nonheap.used": 61683,
"nonheap": 0,
"threads.peak": 28,
"threads.daemon": 26,
"threads.totalStarted": 32,
"threads": 28,
"classes": 8913,
"classes.loaded": 8913,
"classes.unloaded": 0,
"gc.ps_scavenge.count": 9,
"gc.ps_scavenge.time": 61,
"gc.ps_marksweep.count": 2,
"gc.ps_marksweep.time": 96,
"httpsessions.max": -1,
"httpsessions.active": 0,
"datasource.primary.active": 0,
"datasource.primary.usage": 0.0
}
所有的結(jié)果都是以json形式返回。下面時暴露的接口列表:
HTTP方法 | 路徑 | 描述 |
---|---|---|
GET | /autoconfig | 提供了一份自動配置報告,記錄哪些自動配置條件通過了,哪些沒通過 |
GET | /configprops | 描述配置屬性(包含默認(rèn)值)如何注入Bean |
GET | /beans | 描述應(yīng)用程序上下文里全部Bean,以及它們的關(guān)系型 |
GET | /dump | 獲取線程活動的快照 |
GET | /env | 獲取全部環(huán)境屬性 |
GET | /env/{name} | 根據(jù)名稱獲取特定的環(huán)境屬性 |
GET | /health | 報告應(yīng)用程序的健康指標(biāo) |
GET | /info | 獲取應(yīng)用程序的定制信息,這些信息由info打頭的屬性提供 |
GET | /mappings | 描述全部的URI路徑,以及它們和控制器(包含Actuator端點)的映射關(guān)系 |
GET | /metrics | 報告各種應(yīng)用程序度量信息 ,比如內(nèi)存用量和HTTP請求次數(shù)等 |
GET | /metrics/{name} | 報告指定名稱應(yīng)用程序度量值 |
GET | /shutdown | 關(guān)閉應(yīng)用程序,要求endpoints.shutdown.enable設(shè)置為true |
GET | /trace | 提供基本的HTTP請求跟蹤信息(時間戳、HTTP頭等),只保存前100條請求信息,也可以通過配置來實現(xiàn)持久化到數(shù)據(jù)庫 |