本章認識 Spring Boot 專案的骨架:如何產生專案、目錄結構的意義、 在管什麼,以及貫穿全書的「三層式架構」。

Spring Boot 是什麼?

Spring 是 Java 後端最主流的框架家族,但傳統 Spring 需要大量的 XML 與環境設定, 光是「跑起來」就要耗掉新手一整天。Spring Boot 的使命就是消滅這些繁瑣設定:

  • 自動設定(Auto-configuration):偵測 classpath 上的套件自動完成設定。 加入 MySQL 驅動與 JPA,它就自動幫你設定好連線池與 Hibernate。

  • 起步依賴(Starter): 一個座標, 就帶入 Web 開發需要的整組相容套件。

  • 內嵌伺服器:Tomcat 直接包在程式裡, 即可啟動, 不必另外安裝與部署到應用伺服器——這也是它適合容器化的原因。

Spring Boot 為所有事情提供「合理的預設值」:連接埠預設 8080、 設定檔預設讀 、JSON 轉換預設用 Jackson…… 你只需要設定「跟預設不同」的部分,因此設定檔可以非常精簡。

用 Spring Initializr 產生專案骨架

Spring 官方提供產生器網站 https://start.spring.io, 本教材的專案就是用以下參數產生的(IntelliJ IDEA 的 New Project 也內建同樣功能):

欄位 值
Project Maven
Language Java
Spring Boot 3.5.x
Group
Artifact
Packaging Jar
Java 17

Dependencies(相依套件)請加入以下五個:

lP8cm 套件 & 用途
Spring Web & 開發 REST API(Spring MVC + 內嵌 Tomcat)
Spring Data JPA & ORM 資料存取(Hibernate + Repository)
Spring Security & 認證與授權框架
Validation & Bean Validation 輸入驗證
MySQL Driver & MySQL JDBC 驅動程式

按下 Generate 會下載一個 zip,解壓縮後用 IDE 開啟即可。 (JWT 函式庫 JJWT 不在 Initializr 清單中,需手動加入 ,見 2.4 節。)

本教材已附上完整專案 ,可以直接開啟使用, 不必自己從 Initializr 重新產生。建議先直接使用附帶專案, 學完全書後再練習從零開始建立一次。

專案目錄結構

bookstore-api/
|-- pom.xml                        # Maven 設定:相依套件與建置方式
|-- Dockerfile                     # Docker 映像檔建置腳本(第 7 章)
|-- docker-compose.yml             # 一鍵啟動 MySQL + API(第 7 章)
|-- .dockerignore                  # Docker 建置時要排除的檔案
`-- src/
    `-- main/
        |-- java/com/example/bookstore/
        |   |-- BookstoreApiApplication.java   # 程式進入點
        |   |-- config/            # 設定類別(Security 設定、種子資料)
        |   |-- controller/        # 控制層:接收 HTTP 請求
        |   |-- dto/               # 資料傳輸物件(請求 / 回應格式)
        |   |-- entity/            # JPA Entity:對映資料表
        |   |-- exception/         # 自訂例外與全域例外處理
        |   |-- repository/        # 資料存取層:操作資料庫
        |   |-- security/          # JWT 與 Spring Security 元件
        |   `-- service/           # 商業邏輯層
        `-- resources/
            `-- application.yml    # 主設定檔(資料庫連線、JWT 參數)

所在的套件() 是「元件掃描」的起點:Spring 只會自動掃描這個套件與其子套件。 若把類別放到外面(例如 ),Spring 會完全看不到它, 出現「Bean 找不到」的錯誤時,第一件事就是檢查套件位置。

pom.xml 完整解說

是 Maven 的核心設定檔。先看完整內容(每一段都有註解), 再整理幾個重要觀念。

  • parent 繼承: 統一管理了數百個套件的 相容版本,所以大多數 dependency 都不用(也不建議)自己寫版本號。

  • starter 起步依賴:每個 都是一組套件的集合, 例如 內含 Spring MVC、Jackson、內嵌 Tomcat。

  • scope 範圍: 表示編譯期不需要、執行期才需要 (如 MySQL 驅動); 表示只有測試程式用得到。

  • spring-boot-maven-plugin:讓 打包出 「可獨立執行的 fat JAR」,內含所有相依套件與內嵌 Tomcat。

程式進入點

三層式架構:一個請求的旅程

本專案採用後端最經典的三層式架構(Three-tier Architecture), 每一層只做自己的事,彼此透過介面協作:

以「新增書籍」為例,一個請求的完整旅程:

  1. Client 送出 ,本文是書籍 JSON。

  2. Controller 把 JSON 轉成 DTO 並執行輸入驗證, 然後呼叫 Service。

  3. Service 檢查商業規則(ISBN 不可重複),把 DTO 轉成 Entity, 交給 Repository;整個方法包在一個交易中。

  4. Repository(Spring Data JPA 自動實作)呼叫 Hibernate, 產生 送往 MySQL。

  5. 結果一路回傳:Entity \(\to\) 轉成 DTO \(\to\) Controller 包裝成 回應。

關注點分離:HTTP 細節只存在 Controller、商業規則集中在 Service、 SQL 細節只存在 Repository。好處是:改一層不動其他層、 每一層可以獨立測試、程式碼各歸其位容易維護。

第一次啟動專案

確認 MySQL 已啟動(第 1 章),然後在 目錄執行:

# 方式一:用 Maven 插件啟動(開發時最常用)
mvn spring-boot:run

# 方式二:先打包成 JAR 再執行(部署時的形式)
mvn clean package -DskipTests
java -jar target/bookstore-api-1.0.0.jar

啟動成功會看到類似輸出:

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.5.4)

... Tomcat started on port 8080 (http) with context path '/'
... 已建立測試帳號 -> admin / Admin@123(管理員)、user / User@123(一般使用者)
... 已建立 3 本範例書籍
... Started BookstoreApiApplication in 3.2 seconds

開啟瀏覽器連到 http://localhost:8080/api/books, 看到書籍列表的 JSON 就代表整條「API \(\to\) 資料庫」的路都通了!

:連不上 MySQL——確認 MySQL 有啟動、 連接埠 3306 正確、帳號密碼與 一致(第 3 章詳述)。 :8080 被別的程式佔用——關掉佔用的程式, 或在 修改 。