iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
3
Modern Web

站在Web前端人員角度,學習 Spring Boot 後端開發系列 第 10

Day 10 - Spring Boot 三層式架構+Service層&Controller層

  • 分享至 

  • xImage
  •  

世界上沒有確定的事,這是我唯一確定的 --《A Beautiful Mind》

三層式架構

簡單介紹後端程式大致可以分為三層架構,每個層都有自己的職責,降低層與層之間的依賴,並不是將程式碼寫在同一個地方。

- 介面層: 負責接收前端的請求,並請業務邏輯層處理,再回傳資料給前端; 也可以為View層,渲染使用者視圖。

- 業務邏輯層:被表示層呼叫,根據請求做資料處理或是處理從DAO回來的資料。

- 資料訪問層:對資料庫做增修查改等操作。

  • 優點:
    • 良好的共用性與擴充性
    • 良好安全性
    • 後期維護成本低
    • 有利於摽準化
  • 缺點:
    由於每一層有上下關聯需要修改,如果介面層增加功能,勢必業務邏輯層與資料訪問層也需要增加相對應的程式碼,比起直接使用不分層架構,會更降低系統的效能。

實作Service層與Controller層,示意圖如下

https://ithelp.ithome.com.tw/upload/images/20200919/201188579Rc6zVIk2b.png

Service層

(1)新增一個service TodoService.java 請求資料後,並處理資料。

import com.caili.todolist.entity.Todo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TodoService {
    @Autowired
    TodoDao todoDao; // 取得Dao物件

    public Iterable<Todo> getTodos () {
        return todoDao.findAll();
    }
}

(2)在TodoService類別上方下 @Service 標註,此為業務邏輯層,可以將業務邏輯的程式碼撰寫在這裡,
(3) 標註@Autowired 可以讓Spring自動把屬性需要的對象從Spring容器找出来,並注入给該屬性,在這裡將TodoDao 注入在此。
(4)最後,創建一個getTodos 方法,利用上一篇創建的todoDaoDAO物件繼承CrudRepository介面 ,透過物件操作findAll()方法,取回資料庫ToDo的所有資料,在這裡可以對從dao回傳的資料做處理,但這個範例是將取得的Iterable物件直接回傳,而CrudRepository文件 也提供許多操作資料庫的方法,如findById()save() 等。

Controller層

上一篇創建的dao與剛剛service層,就要來處理前端網頁端發送出來的請求了,接著要建立controller層。

(1)新增一個service TodoController.java 處理來自web的請求
(2)在類別上方標註下@RestController 聲明此類別RESTful Web服務。
(3)透過@Autowired 注入TodoService,取得service層的物件。
(4)創建一個方法,並用@GetMapping("/todos") 標註接收HTTP請求[ GET] /todos對映到getTodoList這個方法,利用todoService物件取得所有資料並回應請求。

以下用@RestController 創造一個[GET/todos的Rest API
呼叫TodoService的getTodos()方法取得所有資料並返回請求,默認為JSON格式。

import com.caili.todolist.entity.Todo;
import com.caili.todolist.service.TodoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TodoController {
    @Autowired
    TodoService todoService;//取得Service物件

    @GetMapping("/todos")
    public Iterable<Todo> getTodoList () {
        Iterable<Todo> todoList = todoService.getTodos();
        return todoList;
    }
}

我們實際來測試看看,由於之前建立todolist的資料庫我們一開始沒有預設沒有任何的資料,現在我們要手動將資料insert進去。
(1)將application啟動 ./mvnw spring-boot:run
(2)接著,進入http://localhost:9100/h2-console/ 點擊Connect 連接資料庫GUI介面。(註:我們在application.yml 設定port為9100)
(3) 在SQL Statement 區撰寫SQL指令,插入多筆資料。
https://ithelp.ithome.com.tw/upload/images/20200919/201188572O65tAjYLx.png
(4) 因為我們已經插入多筆資料了,接著去http://localhost:9100/todos查看,可以看到我們剛剛鍵入所有todos的資料。這樣就完成了一個HTTP GET API了,從Controller -> Service -> DAO -> DB 串接。
https://ithelp.ithome.com.tw/upload/images/20200919/20118857YNXADo6yru.png


上一篇
Day 09 - Spring Boot 基礎單元測試
下一篇
Day 11 - Spring Boot 模版引擎 x Thymeleaf
系列文
站在Web前端人員角度,學習 Spring Boot 後端開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

最近在研究Golang的Clean Architecture,裡面介紹到了很多DI的概念,原來Spring boot也是這樣一層一層的注入的,真是長知識了~

cailiwu iT邦新手 4 級 ‧ 2020-09-19 22:53:54 檢舉

阿~我也長知識了~開心/images/emoticon/emoticon07.gif

我要留言

立即登入留言