《Spring Boot 實(shí)戰(zhàn):從0到1》第2章 快速開始Hello World

第2章 快速開始Hello World

大約20年前奉瘤,程序員們使用“企業(yè)級(jí)Java Bean”(EJB)開發(fā)企業(yè)應(yīng)用亲族,需要配置復(fù)雜的XML种呐。在二十世紀(jì)初期,新興Java技術(shù)——Spring噩死,橫空出世颤难。使用極簡(jiǎn)XML和POJO(普通Java對(duì)象),結(jié)合EJB的替代品(如Hibernate)已维,Spring在企業(yè)級(jí)Java開發(fā)上占據(jù)了絕對(duì)領(lǐng)先地位行嗤。

但是,隨著Spring的不斷發(fā)展垛耳,當(dāng)初的XML配置逐漸變得復(fù)雜龐大栅屏,成了累贅,遭眾多程序員“詬病”堂鲜。后來(lái)栈雳,Spring推出了JavaConfig項(xiàng)目,使用聲明式的注解缔莲,大量減少了顯式的XML配置哥纫。

然而,故事到這里痴奏,并沒有結(jié)束蛀骇。

下面即將進(jìn)入我們的 SpringBoot 之旅。

Boot:引導(dǎo)读拆,啟動(dòng)也擅憔。

本章我們快速開始 Hello World 的體驗(yàn)。

1.1 Spring Boot CLI groovy版Hello World

1.1.1 配置環(huán)境

首先安裝Spring Boot CLI建椰,我們?nèi)ミ@里下載最新版本的壓縮包
http://repo.spring.io/snapshot/org/springframework/boot/spring-boot-cli/
當(dāng)前最新版本是:2.0.0.BUILD-SNAPSHOT 雕欺。

我們把下載好的spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.zip 解壓到相應(yīng)的目錄下岛马,然后配置環(huán)境變量:

$vim .bashrc
export SPRING_BOOT_HOME=/Users/jack/soft/spring-2.0.0.BUILD-SNAPSHOT
export PATH=$PATH:$SPRING_BOOT_HOME/bin

提示:更多安裝參考文檔:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-installing-the-cli

在命令行驗(yàn)證spring環(huán)境安裝成功:

$ source .bashrc
$ spring --version
Spring CLI v2.0.0.BUILD-SNAPSHOT

1.1.2 編寫控制器groovy代碼

隨便打開一個(gè)編輯器棉姐,新建文件HelloController.groovy屠列,敲入如下代碼:

 @Controller
 class HelloController{
      @RequestMapping("/hello")
      @ResponseBody
      String hello(){
          return "Hello World!"
      }
 }

1.1.3 運(yùn)行測(cè)試

然后在命令行執(zhí)行:

$ spring run HelloController.groovy

你將會(huì)在控制臺(tái)看到輸出以下日志

螢?zāi)豢煺?2017-08-01 13.02.12.png

一個(gè)極簡(jiǎn)的Restful Hello World就搞定了。

瀏覽器訪問(wèn):http://localhost:8080/hello(或者curl http://localhost:8080/hello

你會(huì)看到輸出:

Hello World!

1.2 常規(guī)的Java版的Hello World

1. 創(chuàng)建 SpringBoot Web 項(xiàng)目

我們可以直接在命令行輸入

$ spring init -dweb --build gradle
Using service at https://start.spring.io

Content saved to 'demo.zip'

來(lái)創(chuàng)建一個(gè)模板項(xiàng)目伞矩,也可以到Spring Initializer : https://start.spring.io/ 頁(yè)面進(jìn)行操作笛洛。

為了更加直觀,我們?cè)赟pring Initializer頁(yè)面創(chuàng)建項(xiàng)目示例乃坤。如下圖所示

創(chuàng)建項(xiàng)目

首先苛让,我們依次選擇 Gradle Project, Java湿诊, SpringBoot 版本是 2.0.0.BUILD-SNAPSHOT 狱杰。

然后,配置項(xiàng)目基本信息

Group :com.easy.springboot
Artifact: chapter1_helloworld

依賴項(xiàng)我們就先只用 Web 厅须。

最后仿畸,點(diǎn)擊 Generate Project , 頁(yè)面會(huì)自動(dòng)生成一個(gè)模板工程 zip 包:chapter1_helloworld.zip 。

2.解壓zip朗和,導(dǎo)入idea中

導(dǎo)入 Gradle 工程错沽,配置 Gradle 環(huán)境,如下圖

配置 Gradle 環(huán)境

等待 IDEA 構(gòu)建完畢眶拉,我們將得到一個(gè)標(biāo)準(zhǔn)的 SpringBoot Application

.
├── build.gradle
├── chapter1_helloworld.iml
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── easy
    │   │           └── springboot
    │   │               └── chapter1_helloworld
    │   │                   └── Chapter1HelloworldApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        ├── java
        │   └── com
        │       └── easy
        │           └── springboot
        │               └── chapter1_helloworld
        │                   └── Chapter1HelloworldApplicationTests.java
        └── resources

19 directories, 9 files


3. build.gradle配置文件

我們來(lái)看一下生成的模板工程里面的Gradle配置文件

buildscript {
    ext {
        springBootVersion = '2.0.0.BUILD-SNAPSHOT'
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

我們通過(guò)下面的表格簡(jiǎn)要說(shuō)明如下

配置項(xiàng) 功能說(shuō)明
spring-boot-gradle-plugin 這個(gè)插件在 Gradle中提供了SpringBoot支持千埃,例如打包可執(zhí)行的jar或war,運(yùn)行SpringBoot應(yīng)用程序等功能忆植。它使用spring-boot-dependencies 提供的依賴管理放可。這樣我們?cè)赿ependencies 添加SpringBoot依賴的時(shí)候可以不用指定版本號(hào)。
apply plugin: 'org.springframework.boot' 應(yīng)用spring-boot-gradle-plugin插件
compile('org.springframework.boot:spring-boot-starter-web') Spring 全棧式Web開發(fā)啟動(dòng)器朝刊,包括Tomcat吴侦、spring-webmvc、SpringBoot AutoConfigure 等核心依賴

4. SpringBoot 應(yīng)用啟動(dòng)類

我們使用 @SpringBootApplication 注解來(lái)標(biāo)注SpringBoot 應(yīng)用的啟動(dòng)類坞古。

package com.easy.springboot.chapter1_helloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Chapter1HelloworldApplication {

    public static void main(String[] args) {
        SpringApplication.run(Chapter1HelloworldApplication.class, args);
    }
}

同樣的备韧,你將看到控制臺(tái)輸出如下日志:

...
 :: Spring Boot ::  (v2.0.0.BUILD-SNAPSHOT)

2017-08-01 14:31:43.849  INFO 4987 --- [           main] c.e.s.c.Chapter1HelloworldApplication    : Starting Chapter1HelloworldApplication on jacks-MacBook-Air.local with PID 4987 
...
2017-08-01 14:31:47.841  INFO 4987 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http)
2017-08-01 14:31:47.846  INFO 4987 --- [           main] c.e.s.c.Chapter1HelloworldApplication    : Started Chapter1HelloworldApplication in 5.74 seconds (JVM running for 7.021)

通過(guò)日志,我們可以看到SpringBootApplication大致的啟動(dòng)流程。這個(gè)過(guò)程中掀虎,很大一部分工作是在做SpringBoot 的自動(dòng)配置村斟。

5. @SpringBootApplication注解

@SpringBootApplication注解是 SpringBoot 應(yīng)用的啟動(dòng)類的注解,它包括三個(gè)注解易阳,如下表

注解 功能說(shuō)明
@SpringBootConfiguration 等同于@Configuration,表示將該類是SpringBoot 應(yīng)用程序入口類
@EnableAutoConfiguration 表示程序啟動(dòng)時(shí)吃粒,啟動(dòng)SpringBoot默認(rèn)的自動(dòng)配置潦俺。自動(dòng)配置類通常根據(jù)類路徑和我們自定義的 bean 來(lái)執(zhí)行相應(yīng)的自動(dòng)配置策略。例如, 如果我們的類路徑上有tomcat-embedded.jar , 那么SpringBoot 就會(huì)嘗試去自動(dòng)配置TomcatServletWebServerFactory Bean事示,或者去配置我們自定義的 ServletWebServerFactory Bean早像。
@ComponentScan 表示程序啟動(dòng)時(shí)自動(dòng)掃描當(dāng)前包及子包下所有類。

6. 編寫控制器類HelloWorldController

我們簡(jiǎn)單編寫一個(gè) RestController肖爵,代碼如下

package com.easy.springboot.chapter1_helloworld.controller;

import java.util.Date;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
    @RequestMapping("hello")
    String hello() {
        return "Hello World! " + new Date();
    }
}

7. 運(yùn)行測(cè)試

我們?cè)?IDEA 中直接點(diǎn)擊 main 函數(shù)運(yùn)行

點(diǎn)擊 main 函數(shù)運(yùn)行

可以看到控制臺(tái)輸入如下的日志:

...
 :: Spring Boot ::  (v2.0.0.BUILD-SNAPSHOT)

2017-08-01 14:57:24.928  INFO 5224 --- [           main] c.e.s.c.Chapter1HelloworldApplication    : Starting Chapter1HelloworldApplication on  
...
Mapped "{[/hello]}" onto java.lang.String com.example.controller.HelloWorldController.hello()
...
2017-08-01 14:57:28.468  INFO 5224 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http)
2017-08-01 14:57:28.479  INFO 5224 --- [           main] c.e.s.c.Chapter1HelloworldApplication    : Started Chapter1HelloworldApplication in 4.128 seconds (JVM running for 4.914)

瀏覽器訪問(wèn):http://localhost:8080/hello

我們將看到如下輸出:

Hello World! Tue Apr 04 23:08:33 CST 2017

另外卢鹦,如果是在命令行運(yùn)行,使用SpringBoot gradle插件的執(zhí)行:

gradle bootRun

如果是使用的 Maven劝堪,那么對(duì)應(yīng)的是SpringBoot maven插件的執(zhí)行:

mvn spring-boot:run

8. 運(yùn)維監(jiān)控

SpringBoot 本身提供了豐富的健康監(jiān)控等運(yùn)維功能冀自,這些功能在 actuator 里。我們?cè)赽uild.gradle的依賴?yán)锩嫣砑右恍衋ctuator的配置

compile('org.springframework.boot:spring-boot-starter-actuator')

為了方便測(cè)試秒啦,我們?cè)赼pplication.properties 添加如下配置

endpoints.metrics.enabled=true
management.security.enabled=false // 去掉安全校驗(yàn)

然后重啟應(yīng)用熬粗,我們可以看到 IDEA 的控制臺(tái)Endpoints 的 Beans Tab界面里面有我們的這個(gè) SpringBoot 應(yīng)用的所有 Bean 的信息列表

Endpoints 的 Beans 界面
helloWorldController Bean

Health Tab 界面中我們可以看到服務(wù)器(本機(jī))的磁盤使用信息

Health Tab 界面

在請(qǐng)求映射 Mappings 界面我們可以看到SpringBoot 應(yīng)用提供出來(lái)的所有的 Rest 接口

Mappings 界面

例如,我們?cè)L問(wèn)http://127.0.0.1:8080/application/health 余境, 可以得到如下輸出

{
  "status": "UP",
  "diskSpace": {
    "status": "UP",
    "total": 120108089344,
    "free": 1280909312,
    "threshold": 10485760
  }
}

其他的監(jiān)控 API荐糜,可以類似訪問(wèn),看看輸出的內(nèi)容葛超。關(guān)于spring actuator 監(jiān)控的更多內(nèi)容暴氏,我們將在后面的章節(jié)中介紹。

本章小結(jié)

本章我們通過(guò)兩個(gè)Hello World 實(shí)例绣张,快速體驗(yàn)了 SpringBoot 開發(fā)的過(guò)程答渔。在 SpringBoot 里面我們不再有各種繁雜的 xml 配置,不再有配置侥涵、啟動(dòng)沼撕、運(yùn)行 Tomcat Web 服務(wù)器的一系列繁瑣操作了。

同時(shí)您也一定發(fā)現(xiàn)了:我們的這個(gè) Web 應(yīng)用是怎么啟動(dòng)運(yùn)行的芜飘?

下一章中我們就來(lái)一起學(xué)習(xí)一下 SpringBoot 應(yīng)用的啟動(dòng)過(guò)程和自動(dòng)配置原理务豺。

https://github.com/EasySpringBoot/chapter1_helloworld

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嗦明,隨后出現(xiàn)的幾起案子笼沥,更是在濱河造成了極大的恐慌,老刑警劉巖娶牌,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奔浅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡诗良,警方通過(guò)查閱死者的電腦和手機(jī)汹桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鉴裹,“玉大人舞骆,你說(shuō)我怎么就攤上這事钥弯。” “怎么了督禽?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵脆霎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赂蠢,道長(zhǎng)绪穆,這世上最難降的妖魔是什么辨泳? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任虱岂,我火速辦了婚禮,結(jié)果婚禮上菠红,老公的妹妹穿的比我還像新娘第岖。我一直安慰自己,他們只是感情好试溯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布蔑滓。 她就那樣靜靜地躺著,像睡著了一般遇绞。 火紅的嫁衣襯著肌膚如雪键袱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天摹闽,我揣著相機(jī)與錄音蹄咖,去河邊找鬼。 笑死付鹿,一個(gè)胖子當(dāng)著我的面吹牛澜汤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舵匾,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼俊抵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坐梯?” 一聲冷哼從身側(cè)響起徽诲,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吵血,沒想到半個(gè)月后馏段,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡践瓷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年院喜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晕翠。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喷舀,死狀恐怖砍濒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硫麻,我是刑警寧澤爸邢,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站拿愧,受9級(jí)特大地震影響杠河,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浇辜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一券敌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柳洋,春花似錦待诅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绪囱,卻和暖如春测蹲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鬼吵。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工扣甲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人而柑。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓文捶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親媒咳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粹排,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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