你們要的干貨來了——實戰(zhàn) Spring Boot

什么是 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 非常適合構建微服務衅檀。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霎俩,隨后出現(xiàn)的幾起案子哀军,更是在濱河造成了極大的恐慌,老刑警劉巖打却,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杉适,死亡現(xiàn)場離奇詭異,居然都是意外死亡柳击,警方通過查閱死者的電腦和手機猿推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌肴,“玉大人蹬叭,你說我怎么就攤上這事∽粗” “怎么了秽五?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長试幽。 經(jīng)常有香客問我筝蚕,道長,這世上最難降的妖魔是什么铺坞? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任起宽,我火速辦了婚禮,結果婚禮上济榨,老公的妹妹穿的比我還像新娘坯沪。我一直安慰自己,他們只是感情好擒滑,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布腐晾。 她就那樣靜靜地躺著叉弦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藻糖。 梳的紋絲不亂的頭發(fā)上淹冰,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音巨柒,去河邊找鬼樱拴。 笑死,一個胖子當著我的面吹牛洋满,可吹牛的內(nèi)容都是我干的晶乔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼牺勾,長吁一口氣:“原來是場噩夢啊……” “哼正罢!你這毒婦竟也來了?” 一聲冷哼從身側響起驻民,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤翻具,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后川无,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呛占,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年懦趋,在試婚紗的時候發(fā)現(xiàn)自己被綠了晾虑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅叫,死狀恐怖帜篇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诫咱,我是刑警寧澤笙隙,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站坎缭,受9級特大地震影響竟痰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掏呼,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一坏快、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憎夷,春花似錦莽鸿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兔沃。三九已至,卻和暖如春级及,著一層夾襖步出監(jiān)牢的瞬間乒疏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工创千, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缰雇,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓追驴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疏之。 傳聞我的和親對象是個殘疾皇子殿雪,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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