什么是 Spring Boot
Spring 在官方首頁這樣介紹:
BUILD ANYTHING . Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. Spring Boot takes an opinionated view of building production ready applications.
解釋一下:Spring Boot 可以構建一切姚糊。Spring Boot 設計之初就是為了最少的配置趾代,最快的速度來啟動和運行 Spring 項目泞遗。Spring Boot 使用特定的配置來構建生產(chǎn)就緒型的項目。
使用 Spring Boot 有什么好處
其實就是簡單佃延、快速、方便!如果搭建一個 Spring Web 項目的時候需要怎么做呢哮兰?
配置 web.xml贺纲,加載 Spring 和 Spring MVC
配置數(shù)據(jù)庫連接航闺、配置 Spring 事務
加載配置文件的讀取,開啟注解
配置日志文件
…
配置完成之后部署 Tomcat 調(diào)試
…
現(xiàn)在非常流行微服務,如果我這個項目僅僅只是需要發(fā)送一個郵件潦刃,如果我的項目僅僅是生產(chǎn)一個積分侮措;我都需要這樣折騰一遍!
但是如果使用 Spring Boot 呢?很簡單乖杠,僅僅只需要三步就可以快速的搭建起一個 Web 項目分扎!
使用 Spring Boot 到底有多爽,用下面這幅圖來表達:
快速入門
說了那么多胧洒,手癢癢的很畏吓,馬上來一發(fā)試試!
構建項目
(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 按鈕,也會出現(xiàn)上述類似的配置界面感耙,Idea 幫我們做了集成褂乍。
(3)填寫相關內(nèi)容后,單擊 Next 按鈕即硼,選擇依賴的包再單擊 Next 按鈕逃片,最后確定信息無誤單擊 Finish 按鈕。
對上面的配置做一個解釋:
第一個選擇框選擇創(chuàng)建以 Maven 構建項目只酥,還是以 Gradle 構建項目褥实,這是兩種不同的構建方式,其中 Gradel 配置內(nèi)容更簡潔一些裂允,并且包含了 Maven 的使用损离,不過日常使用 Maven 居多。
第二個選擇框選擇編程語言绝编,現(xiàn)在支持 Java僻澎、Kotlin 和 Groovy貌踏。
第三個選擇框選擇 Spring Boot 版本,可以看出 Spring Boot 2.0 已經(jīng)到了第五個里程碑了窟勃。在實際使用中祖乳,我們會優(yōu)先使用穩(wěn)定版本,1.0 的最新穩(wěn)定版本是 1.5.8拳恋,也是我們演示使用的版本凡资。
下面就是項目的配置信息了。
Group:一般填寫公司域名谬运,比如百度公司填 com.baidu隙赁,演示使用 com.neo。
Artifact:可以理解為項目的名稱梆暖,可以根據(jù)實際情況來填伞访,本次演示填寫 helloWorld。
Dependencies:在這塊添加我們項目所依賴的 Spring Boot 組件轰驳,可以多選厚掷。本次選擇 Web、devtools 兩個模塊级解。
項目結構介紹
如上圖所示冒黑,Spring Boot 的基礎結構共三個文件:
src/main/java:程序開發(fā)以及主程序入口
src/main/resources:配置文件
src/test/java:測試程序
另外,Sping Boot 建議的目錄結果如下:
root package 結構:com.example.myproject
``` xml myproject +-src +- main +- java +- com.example.myproject +- comm +- domain +- repository +- service +- web +- Application.java +- resources +- static +- templates +- application.properties +- test +-pom.xml
com.example.myproject 目錄下:
- Application.java:建議放到根目錄下面勤哗,是項目的啟動類抡爹,Spring Boot 項目只能有一個 main() 方法。
- comm:目錄建議放置公共的類芒划,如全局的配置文件冬竟、工具類等。
- domain:目錄主要用于實體(Entity)與數(shù)據(jù)訪問層(Repository)民逼。
- repository:數(shù)據(jù)庫訪問層代碼泵殴。
- service:該層主要是業(yè)務類代碼。
- web:該層負責頁面訪問控制拼苍。
resources 目錄下:
- static:目錄存放 Web 訪問的靜態(tài)資源笑诅,如 JS、CSS疮鲫、圖片等苟鸯。
- templates:目錄存放頁面模板。
- application.properties:項目的配置信息棚点。
test 目錄存放單元測試的代碼;pom.xml 用于配置項目依賴包湾蔓,以及其他配置瘫析。
采用默認配置可以省去很多設置,當然也可以根據(jù)自己的喜好來進行更改。最后贬循,啟動 Application main 方法咸包,至此一個 Java 項目搭建好了!
### 簡單 Web 開發(fā)
(1)可以在 Spring Initializr 上面添加杖虾,也可以手動在 pom.xml 中添加:
xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
pom.xml 文件中默認有兩個模塊:
- spring-boot-starter:核心模塊烂瘫,包括自動配置支持、日志和 YAML奇适;
- spring-boot-starter-test:測試模塊坟比,包括 JUnit、Hamcrest嚷往、Mockito葛账。
(2)編寫 controller 內(nèi)容:
java @RestController public class HelloWorldController {
@RequestMapping("/hello")
public String hello() {
return "Hello World";
}
}
`@RestController` 的意思就是 controller 里面的方法都以 json 格式輸出,不用再配置什么 jackjson 的了皮仁!
如果配置為`@Controller` 就代表著輸出為頁面內(nèi)容籍琳。
(3)啟動主程序,打開瀏覽器訪問 [http://localhost:8080/hello](http://localhost:8080/hello)贷祈,就可以看到以下內(nèi)容趋急,是不是很簡單!
Hello World
(4)如果我們想傳入?yún)?shù)怎么辦势誊?
java @RestController public class HelloWorldController {
@RequestMapping("/hello")
public String index(String name) {
return "Hello World, " +name;
}
}
重新啟動項目呜达,訪問 [http://localhost:8080/hello?name=neo](http://localhost:8080/hello?name=neo),返回內(nèi)容如下:
Hello World键科,neo
經(jīng)過上一個測試發(fā)現(xiàn)闻丑,修改 controller 內(nèi)相關代碼,就需要重新啟動項目才能生效勋颖,這樣做很麻煩是不是嗦嗡,別著急。Spring Boot 提供了另外一個組件來解決饭玲。
#### 熱部署
熱啟動就需要用到我們在一開始引入的另外一個組件:devtools侥祭。它是 Spring Boot 提供的一組開發(fā)工具包,其中就包含我們需要的熱部署功能茄厘。但是在使用這個功能之前還需要再做一些配置矮冬。
(1)在 dependency 中添加 optional 屬性,并設置為 true:
xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
(2)在 plugin 中配置另外一個屬性 fork次哈,并且配置為 true:
xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build>
OK胎署,以上兩步配置完成,如果讀者使用的是 Eclipse窑滞,那么恭喜你大功告成了琼牧。
如果讀者使用的是 Idea 還需要做以下配置恢筝。
(3)配置 Idea
選擇 File-Settings-Compiler 勾選 ```Build project automatically```,低版本 Idea 勾選 ```make project automatically```巨坊。
![](http://www.ityouknow.com/assets/images/2017/chat/springboot3.png)
使用快捷鍵:`CTRL + SHIFT + A` 輸入` Registry` 找到選項 `compile.automake.allow.when.app.running` 勾選
![](http://www.ityouknow.com/assets/images/2017/chat/springboot4.png)
全部配置完成后撬槽,Idea 就支持熱部署了,大家可以試著去改動一下代碼就會發(fā)現(xiàn) Spring Boot 會自動重新加載趾撵,再也不需要我們手動點擊重新部署了侄柔。
為什么 Idea 需要多配置后面這一步呢,因為 Idea 默認不是自動編譯的占调,需要我們手動去配置后才會自動編譯暂题,而熱部署依賴于項目的自動編譯功能。
> 該模塊在完整的打包環(huán)境下運行的時候會被禁用妈候。如果使用 java -jar 啟動應用或者用一個特定的 classloader 啟動崔泵,它會認為這是一個“生產(chǎn)環(huán)境”俩由。
### 單元測試
單元測試在日常開發(fā)中是必不可少的岖食,一個牛逼的程序員铛绰,單元測試寫得也是杠杠的。下面來看下 Spring Boot 對單元測試又做了哪些支持幔虏?
如果我們只想運行一個 hello World纺念,只需要一個注解就可以。在 src/test 目錄下新建一個 HelloTests 類想括,代碼如下:
java public class HelloTest { @Test public void hello(){ System.out.println("hello world"); } }
單擊右鍵“運行”按鈕陷谱,會發(fā)現(xiàn)控制臺輸出:hello world。僅僅只需要了一個注解瑟蜈。但是如果我們需要測試 web 層的請求呢烟逊?Spring Boot 也給出了支持。
以往我們在測試 web 請求的時候铺根,需要手動輸入相關參數(shù)在頁面測試查看效果宪躯,或者自己寫 post 請求。在 Spring Boot 中位迂,Spring 給出了一個簡單的解決方案访雪;使用 mockmvc 進行 web 測試,mockmvc 內(nèi)置了很多工具類和方法掂林,可以模擬 post臣缀、get 請求,并且判斷返回的結果是否正確等泻帮,也可以利用`print()`打印執(zhí)行結果精置。
java @SpringBootTest public class HelloTest {
private MockMvc mockMvc;
@Before
public void setUp() throws 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`,系統(tǒng)會自動加載 Spring Boot 容器锣杂。在日常測試中氯窍,我們就可以注入 bean 來做一些局部業(yè)務的測試饲常。`MockMvcRequestBuilders`可以 post、get 請求狼讨,使用`print()`方法會將請求和相應的過程都打印出來,如下:
text 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 = null 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 = null Redirected URL = null Cookies = [] ```
從返回的Body = Hello World ,neo可以看出請求成功柒竞。
總結
使用 Spring Boot 可以非常方便政供、快速搭建項目,而不用關心框架之間的兼容性朽基、適用版本等各種問題布隔,我們想使用任何東西,僅僅添加一個配置就可以稼虎,所以使用 Sping Boot 非常適合構建微服務衅檀。