1.什么是 Spring Boot ?
解釋一下:Spring Boot 可以構建一切。Spring Boot 設計之初就是為了最少的配置,最快的速度來啟動和運行 Spring 項目。Spring Boot 使用特定的配置來構建生產就緒型的項目。
Spring Boot 的特性:
-
使用 Spring 項目引導頁面可以在幾秒構建一個項目
-
方便對外輸出各種形式的服務,如 REST API、WebSocket、Web、Streaming、Tasks
-
非常簡潔的安全策略集成
-
支持關系數據庫和非關系數據庫
-
支持運行期內嵌容器,如 Tomcat、Jetty
-
強大的開發包,支持熱啟動
-
自動管理依賴
-
自帶應用監控
-
支持各種 IED,如 IntelliJ IDEA、NetBeans
2.Spring Boot 快速入門
構建項目:
(1)訪問 http://start.spring.io/。
(2)選擇構建工具 Maven Project、Spring Boot 版本 1.5.8 及一些工程基本信息,可參考下圖:
(3)單擊 Generate Project 按鈕并下載項目壓縮包。
(4)解壓后,單擊 Eclipse,Import | Existing Maven Projects | Next | 選擇解壓后的文件夾 | Finsh 命令,OK Done!
(5)如果使用的是 Idea,單擊 File | New | Model from Existing Source.. | 選擇解壓后的文件夾 | OK 命令, 選擇 Maven ,一路 Next,OK Done!
如果讀者使用的是 Idea 工具,也可以這樣:
(1)單擊 File | New | Project… 命令,彈出新建項目框。
(2)選擇 Spring Initializr 選項,單擊 Next 按鈕,也會出現上述類似的配置界面,Idea 幫我們做了集成。
(3)填寫相關內容后,單擊 Next 按鈕,選擇依賴的包再單擊 Next 按鈕,最后確定信息無誤單擊 Finish 按鈕。
對上面的配置做一個解釋:
-
第一個選擇框選擇創建以 Maven 構建項目,還是以 Gradle 構建項目,這是兩種不同的構建方式,其中 Gradel 配置內容更簡潔一些,并且包含了 Maven 的使用,不過日常使用 Maven 居多。
-
第二個選擇框選擇編程語言,現在支持 JAVA、Kotlin 和 Groovy。
-
第三個選擇框選擇 Spring Boot 版本,可以看出 Spring Boot 2.0 已經到了第五個里程碑了。在實際使用中,我們會優先使用穩定版本,1.0 的最新穩定版本是 1.5.8,也是我們演示使用的版本。
下面就是項目的配置信息了。
-
Group:一般填寫公司域名,比如百度公司填 com.baidu,演示使用 com.neo。
-
Artifact:可以理解為項目的名稱,可以根據實際情況來填,本次演示填寫 helloWorld。
-
Dependencies:在這塊添加我們項目所依賴的 Spring Boot 組件,可以多選。本次選擇 Web、devtools 兩個模塊。
3.項目結構介紹
如上圖所示,Spring Boot 的基礎結構共三個文件:
-
src/main/java:程序開發以及主程序入口
-
src/main/resources:配置文件
-
src/test/java:測試程序
另外,Sping Boot 建議的目錄結果如下:
root package 結構:com.example.myproject
com.example.myproject 目錄下:
-
Application.java:建議放到根目錄下面,是項目的啟動類,Spring Boot 項目只能有一個 main 方法。
-
comm:目錄建議放置公共的類,如全局的配置文件、工具類等。
-
domain:目錄主要用于實體(Entity)與數據訪問層(Repository)。
-
repository:數據庫訪問層代碼。
-
service:該層主要是業務類代碼。
-
web:該層負責頁面訪問控制。
resources 目錄下:
-
static:目錄存放 Web 訪問的靜態資源,如 JS、css、圖片等。
-
templates:目錄存放頁面模板。
-
application.properties:項目的配置信息。
test 目錄存放單元測試的代碼;pom.xml 用于配置項目依賴包,以及其他配置。
采用默認配置可以省去很多設置,當然也可以根據自己的喜好來進行更改。最后,啟動 Application main 方法,至此一個 Java 項目搭建好了!
4.簡單 Web 開發
(1)可以在 Spring Initializr 上面添加,也可以手動在 pom.xml 中添加:
pom.xml 文件中默認有兩個模塊:
-
spring-boot-starter:核心模塊,包括自動配置支持、日志和 YAML;
-
spring-boot-starter-test:測試模塊,包括 JUnit、Hamcrest、Mockito。
(2)編寫 controller 內容:
@RestControllerpublic class HelloWorldController
{ @RequestMapping("/hello")
public String hello
{
return "Hello World"; }}
@RestController
的意思就是 controller 里面的方法都以 json 格式輸出,不用再配置什么 jackjson 的了!
如果配置為@Controller
就代表著輸出為頁面內容。
(3)啟動主程序,打開瀏覽器訪問 http://localhost:8080/hello,就可以看到以下內容,是不是很簡單!
Hello World
(4)如果我們想傳入參數怎么辦?
@RestControllerpublic class HelloWorldController
{ @RequestMapping("/hello")
public String index(String name)
{
return "Hello World, " +name; }}
重新啟動項目,訪問 http://localhost:8080/hello?name=neo,返回內容如下:
Hello World,neo
經過上一個測試發現,修改 controller 內相關代碼,就需要重新啟動項目才能生效,這樣做很麻煩是不是,別著急。Spring Boot 提供了另外一個組件來解決。
5.熱部署
熱啟動就需要用到我們在一開始引入的另外一個組件:devtools。它是 Spring Boot 提供的一組開發工具包,其中就包含我們需要的熱部署功能。但是在使用這個功能之前還需要再做一些配置。
(1)在 dependency 中添加 optional 屬性,并設置為 true:
(2)在 plugin 中配置另外一個屬性 fork,并且配置為 true:
OK,以上兩步配置完成,如果讀者使用的是 Eclipse,那么恭喜你大功告成了。
如果讀者使用的是 Idea 還需要做以下配置。
(3)配置 Idea
選擇 File-Settings-Compiler 勾選 Build project automatically
,低版本 Idea 勾選make project automatically
。
使用快捷鍵:CTRL + SHIFT + A
輸入Registry
找到選項compile.automake.allow.when.app.running
勾選
全部配置完成后,Idea 就支持熱部署了,大家可以試著去改動一下代碼就會發現 Spring Boot 會自動重新加載,再也不需要我們手動點擊重新部署了。
為什么 Idea 需要多配置后面這一步呢,因為 Idea 默認不是自動編譯的,需要我們手動去配置后才會自動編譯,而熱部署依賴于項目的自動編譯功能。
該模塊在完整的打包環境下運行的時候會被禁用。如果使用 java -jar 啟動應用或者用一個特定的 classloader 啟動,它會認為這是一個“生產環境”。
6.單元測試
單元測試在日常開發中是必不可少的,一個牛逼的程序員,單元測試寫得也是杠杠的。下面來看下 Spring Boot 對單元測試又做了哪些支持?
如果我們只想運行一個 hello World,只需要一個注解就可以。在 src/test 目錄下新建一個 HelloTests 類,代碼如下:
public class HelloTest
{ @Test public void hello
{ System.out.println("hello world"); }}
單擊右鍵“運行”按鈕,會發現控制臺輸出:hello world。僅僅只需要了一個注解。但是如果我們需要測試 web 層的請求呢?Spring Boot 也給出了支持。
以往我們在測試 web 請求的時候,需要手動輸入相關參數在頁面測試查看效果,或者自己寫 post 請求。在 Spring Boot 中,Spring 給出了一個簡單的解決方案;使用 mockmvc 進行 web 測試,mockmvc 內置了很多工具類和方法,可以模擬 post、get 請求,并且判斷返回的結果是否正確等,也可以利用print
打印執行結果。
@SpringBootTest
public class HelloTest
{
private MockMvc mockMvc;
@Before
public void setUp t
hrows Exception
{ mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController).build; }
@Test public void getHello
throws Exception
{ mockMvc.perform(MockMvcRequestBuilders.post("/hello?name=小明").accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print); }}
在類的上面添加@SpringBootTest
,系統會自動加載 Spring Boot 容器。在日常測試中,我們就可以注入 bean 來做一些局部業務的測試。MockMvcRequestBuilders
可以 post、get 請求,使用print
方法會將請求和相應的過程都打印出來,如下:
MockHttpServletRequest: HTTP Method = POST Request URI = /hello Parameters = {name=[neo]} Headers = {}Handler: Type = com.neo.helloWorld.web.HelloWorldController Method = public java.lang.String com.neo.helloWorld.web.HelloWorldController.hello(java.lang.String)...MockHttpServletResponse: Status = 200
Error message =
Headers = {Content-Type=[text/plain;charset=ISO-8859-1], Content-Length=[16]} Content type = text/plain;
charset=ISO-8859-1
Body = Hello World ,neo Forwarded URL =
Redirected URL =
Cookies =
從返回的Body = Hello World ,neo
可以看出請求成功。
7.總結
使用 Spring Boot 可以非常方便、快速搭建項目,而不用關心框架之間的兼容性、適用版本等各種問題,我們想使用任何東西,僅僅添加一個配置就可以,所以使用 Sping Boot 非常適合構建微服務。
建議大家使用 Idea 開發 Spring Boot 項目,Eclipse 對 Spring Boot 項目支持并不好,并且使用 Eclipse 偶爾會出現一些詭異的問題,影響初學者的學習。
關于完整的學習 Spring Boot 路徑,我寫了結構更加清晰,知識點更加系統的課程。