EST API的搭建能夠這樣簡單,Spring Boot重拾後端之路

EST API的搭建能夠這樣簡單,Spring Boot重拾後端之路 java學習愛好者 2019-05-26 16:17html

Spring Boot前端

話說我當年接觸Spring的時候着實興奮了好一陣,IoC的概念當初第一次據說,感受有種開天眼的感受。記得當時的web框架和現在的前端框架的局面差很少啊,都是羣雄紛爭。但一晃好多年沒寫事後端,代碼這東西最怕手生,因此看成從新學習了,順便寫個學習筆記。vue

Spring Boot是什麼?java

還恍惚記得當初寫Spring的時候要配置好多xml(在當時仍是相對先進的模式),雖然實現了鬆耦合,但這些xml卻又成爲了項目甩不掉的負擔 -- 隨着項目越作越大,這些xml的可讀性和可維護性極差。後來受.Net平臺中Annotation的啓發,Java世界中也引入了元數據的修飾符,Spring也可使用這種方式進行配置。到了近些年,隨着Ruby on Rails的興起而流行開的 Convention over configuration 理念開始深刻人心。那什麼是 Convention over configuration 呢?簡單來講就是犧牲一部分的自由度來減小配置的複雜度,打個比方就是若是你若是聽從我定義的一系列規則(打個比方,文件目錄結構必須是blablabla的樣子,文件命名必須是nahnahnah 的樣子),那麼你要配置的東西就很是簡單甚至能夠零配置。既然已經作到這個地步了,各類腳手架項目就紛紛涌現了,目的只有一個:讓你更專一在代碼的編寫,而不是浪費在各類配置上。這兩年前端也有相似趨勢,各類前端框架的官方CLI紛紛登場:create-react-app,angular-cli,vue-cli等等。node

那麼Spring Boot就是Spring框架的腳手架了,它能夠幫你快速搭建、發佈一個Spring應用。官網列出了Spring Boot的幾個主要目標react

提供一種快速和普遍適用的Spring開發體驗 開箱即用卻又能夠適應各類變化 提供一系列開發中經常使用的「非功能性」的特性(好比嵌入式服務器、安全、度量、自檢及外部配置等) 不生成任何代碼,不須要xml配置 安裝Spring Bootlinux

官方推薦的方式是經過sdkman( sdkman.io/install.htm… )來進行安裝,固然這是對 *nix 而言。題外話,若是你使用的是Windows 10,真心但願你們安裝Windows 10的Linux子系統,微軟官方出品、原生支持,比虛擬機不知道快到那裏去了 具體安裝過程能夠參考 linux.cn/article-720… 。安裝 sdkman 的步驟很是簡單,就兩步:web

打開一個terminal,輸入 curl -s "get.sdkman.io" | bash 安裝結束後,重啓terminal,輸入 source "$HOME/.sdkman/bin/sdkman-init.sh" 能夠在terminal中驗證一下是否安裝成功 sdk version,若是你看到了版本號就是安裝好了。spring

接下來,就能夠安裝Spring Boot了,仍是打開terminal輸入 sdk install springboot就ok了。vue-cli

固然其實Mac的童鞋能夠省略掉以前的sdkman安裝直接使用 brew 安裝,也是兩步:

在terminal中輸入 brew tap pivotal/tap 而後 brew install springboot 驗證的話能夠輸入 spring --version 看看是否正常輸出了版本號。

建立一個工程

有不少種方法能夠建立一個Spring Boot項目,其中最簡單的一種是經過一個叫Spring Initializr的在線工具 start.spring.io/ 進行工程的生成。以下圖所示,只需填寫一些參數就能夠生成一個工程包了。

使用Spring Initializr進行工程的生成

若是你使用Intellij IDEA進行開發,裏面也集成了這個工具,你們能夠自行嘗試。

Intellij IDEA中集成了 Spring Initializr

但下面咱們要作的不是經過這種方式,而是手動的經過命令行方式建立。建立的是gradle工程,而不是maven的,緣由呢是由於我的如今對於xml類型的配置文件比較無感;-),官方推薦使用gradle 2.14.1版本,請自行安裝gradle。下面來創建一個gradle工程,其實步驟也不算太難:

新建一個工程目錄 mkdir todo 在此目錄下使用gradle進行初始化 gradle init(就和在node中使用 npm init 的效果相似) 這個命令幫咱們創建一個一個使用gradle進行管理的模版工程:

build.gradle:有過Android開發經驗的童鞋可能以爲很親切的,這個就是咱們用於管理和配置工程的核心文件了。 gradlew:用於 *nix 環境下的gradle wrapper文件。 gradlew.bat:用於 Windows 環境下的gradle wrapper文件 setting.gradle:用於管理多項目的gradle工程時使用,單項目時能夠不作理會。 gradle目錄:wrapper的jar和屬性設置文件所在的文件夾。 簡單說兩句什麼是 gradle wrapper。你是否有過這樣的經歷?在安裝/編譯一個工程時須要一些先決條件,須要安裝一些軟件或設置一些參數。若是這一切比較順利還好,但不少時候咱們會發現這樣那樣的問題,好比版本不對,參數沒設置等等。gradle wrapper 就是這樣一個讓你不會浪費時間在配置問題上的方案。它會對應一個開發中使用的gradle版本,以確保任何人任什麼時候候獲得的結果是一致的。

./gradlew : 在 *nix 平臺上運行,例如Linux或Mac OS X gradlew 在Windows平臺運行(是經過gradlew.bat來執行的) 更多關於wrapper的知識能夠去 docs.gradle.org/current/use… 查看。

那麼下面咱們打開默認生成的 build.gradle 文件,將其改形成下面的樣子:

/*

  • 這個build文件是由Gradle的 init 任務生成的。
  • 更多關於在Gradle中構建Java項目的信息能夠查看Gradle用戶文檔中的
  • Java項目快速啓動章節
  • docs.gradle.org/3.3/usergui… / // 在這個段落中你能夠聲明你的build腳本須要的依賴和解析下載該依賴所使用的倉儲位置 buildscript { ext { springBootVersion = '1.4.3.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } /
  • 在這個段落中你能夠聲明使用哪些插件
  • apply plugin: 'java' 表明這是一個Java項目,須要使用java插件
  • 若是想生成一個 Intellij IDEA 的工程,相似的若是要生成
  • eclipse工程,就寫 apply plugin: 'eclipse'
  • 一樣的咱們要學的是Spring Boot,因此應用Spring Boot插件 */ apply plugin: 'java' apply plugin: 'idea' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' // 在這個段落中你能夠聲明編譯後的Jar文件信息 jar { baseName = 'todo' version = '0.0.1-SNAPSHOT' } // 在這個段落中你能夠聲明在哪裏能夠找到你的項目依賴 repositories { // 使用 'jcenter' 做爲中心倉儲查詢解析你的項目依賴。 // 你能夠聲明任何 Maven/Ivy/file 類型的依賴類庫倉儲位置 mavenCentral() } // 在這個段落中你能夠聲明源文件和目標編譯後的Java版本兼容性 sourceCompatibility = 1.8 targetCompatibility = 1.8 // 在這個段落你能夠聲明你的項目的開發和測試所需的依賴類庫 dependencies { compile('org.springframework.boot:spring-boot-starter-web') testCompile('org.springframework.boot:spring-boot-starter-test') } 首先腳本依賴中的 spring-boot-gradle-plugin 有什麼做用呢?它提供瞭如下幾個功能:

簡化執行和發佈:它能夠把全部classpath的類庫構建成一個單獨的可執行jar文件,這樣能夠簡化你的執行和發佈等操做。 自動搜索入口文件:它會掃描 public static void main() 函數而且標記這個函數的宿主類爲可執行入口。 簡化依賴:一個典型的Spring應用仍是須要不少依賴類庫的,想要配置正確這些依賴挺麻煩的,因此這個插件提供了內建的依賴解析器會自動匹配和當前Spring Boot版本匹配的依賴庫版本。 在最後一個段落中,咱們看到咱們的項目依賴兩個類庫,一個是 spring-boot-starter-web ,另外一個是 spring-boot-starter-test。Spring Boot提供了一系列依賴類庫的「模版」,這些「模版」封裝了不少依賴類庫,可讓咱們很是方便的引用本身想實現的功能所須要的類庫。若是咱們去看看這個 spring-boot-starter-web 中究竟引用了什麼,咱們能夠看看它的artifact文件(到 search.maven.org/ 能夠查看):

4.0.0

org.springframework.boot

spring-boot-starters

1.4.3.RELEASE

spring-boot-starter-web

Spring Boot Web Starter

Starter for building web, including RESTful, applications using Spring

MVC. Uses Tomcat as the default embedded container

projects.spring.io/spring-boot…

Pivotal Software, Inc.

www.spring.io

<main.basedir>${basedir}/../..</main.basedir>

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-tomcat

org.hibernate

hibernate-validator

com.fasterxml.jackson.core

jackson-databind

org.springframework

spring-web

org.springframework

spring-webmvc

IDE支持

通常作Java開發,大部分團隊仍是喜歡用一個IDE,雖然我仍是更偏心文本編輯器類型的(好比sublime,vscode,atom等)。可是若是非挑一個重型IDE的話,我更喜歡Intellij IDEA。

使用IDEA的import project功能選中 build.gradle,將工程導入。因爲是個gradle工程,請把 View->Tools Window->Gradle 的視圖窗口調出來。

Gradle工具窗口

點擊左上角的刷新按鈕能夠將全部依賴下載類庫下來。注意IDEA有時提示是否要配置wrapper使用帶源碼的gradle包。

提示使用帶源碼的gradle以便有API的文檔

若是遇到不知道什麼緣由致使一直刷新完成不了的狀況,請在項目屬性中選擇 Use local gradle distribution

image_1b77vqast1d2h1qioeepsdm1tkb9.png-192.5kB

第一個Web API

領域對象

那麼咱們的源代碼目錄在哪裏呢?咱們得手動創建一個,這個目錄通常狀況下是 src/main/java。好的,下面咱們要開始第一個RESTful的API搭建了,首先仍是在 src/main/java 下新建一個 package。既然是本機的就叫 dev.local 吧。咱們仍是來嘗試創建一個 Todo 的Web API,在 dev.local 下創建一個子 package: todo,而後建立一個Todo的領域對象:

package dev.local.todo; /**

  • Todo是一個領域對象(domain object)
  • Created by wangpeng on 2017/1/24. */ public class Todo { private String id; private String desc; private boolean completed; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public boolean isCompleted() { return completed; } public void setCompleted(boolean completed) { this.completed = completed; } } 這個對象很簡單,只是描述了todo的幾個屬性: id 、 desc 和 completed 。咱們的API返回或接受的參數就是以這個對象爲模型的類或集合。

構造Controller

咱們常常看到的RESTful API是這樣的:local.dev/todos、http:… 。Controller就是要暴露這樣的API給外部使用。如今咱們一樣的在 todo 下創建一個叫 TodoController 的java文件

package dev.local.todo;

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

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

import java.util.ArrayList;

import java.util.List;

/**

  • 使用@RestController來標記這個類是個Controller

*/

@RestController

public class TodoController {

// 使用@RequstMapping指定能夠訪問的URL路徑

@RequestMapping("/todos")

public List getAllTodos() {

List todos = new ArrayList<>();

Todo item1 = new Todo();

item1.setId("1");

item1.setCompleted(false);

item1.setDesc("go swimming");

todos.add(item1);

Todo item2 = new Todo();

item2.setId("1");

item2.setCompleted(true);

item2.setDesc("go for lunch");

todos.add(item2);

return todos;

}

}

上面這個文件也比較簡單,但注意到如下幾個事情:

@RestController 和 @RequestMapping 這兩個是元數據註釋,原來在.Net中很常見,後來Java也引進過來。一方面它們能夠增長代碼的可讀性,另外一方面也有效減小了代碼的編寫。具體機理就不講了,簡單來講就是利用Java的反射機制和IoC模式結合把註釋的特性或屬性注入到被註釋的對象中。 咱們看到 List getAllTodos() 方法中簡單的返回了一個List,並未作任何轉換成json對象的處理,這個是Spring會自動利用 Jackson 這個類庫的方法將其轉換成了json。 咱們到這就基本接近成功了,可是如今缺乏一個入口,那麼在 dev.local 包下面創建一個 Applicaiton.java 吧。

package dev.local; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /**

  • Spring Boot 應用的入口文件
  • Created by wangpeng on 2017/1/24. */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 一樣的咱們只需標註這個類是 @SpringBootApplication 就萬事大吉了。可使用下面任意一種方法去啓動咱們的Web服務:

命令行中: ./gradlew bootRun IDEA中在 Application 中右鍵選擇 Run 'Application'

IDE中右鍵啓動應用

啓動後,打開瀏覽器訪問 http://localhost:8080/todos 就能夠看到咱們的json形式的返回結果了。

瀏覽器直接訪問一下的效果

配置Spring Beans工具

因爲使用的是Spring框架,Spring工具窗口也是須要的,通常來講若是你安裝了Spring插件的話,IDEA會自動探測到你的項目是基於Spring的。通常在你增長了Applicaiton入口後,會提示是否添加context。

檢測到Spring配置,但提示還沒有關聯

遇到這種狀況,請點提示框的右方的下箭頭展開提示。

展開後的提示框

點擊 Create Default Context 會將目前的全部沒有map的Spring配置文件都放在這個默認配置的上下文中。在Spring的工具窗口中能夠看到下圖效果。

寫在最後:

碼字不易看到最後了,那就點個關注唄,只收藏不點關注的都是在耍流氓!

關注並私信我「架構」,免費送一些Java架構資料,先到先得!

相關文章
相關標籤/搜索