iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Software Development

spring boot 3 學習筆記系列 第 11

Day11 - Spring Boot Annotation 簡介

  • 分享至 

  • xImage
  •  

在 Spring Boot 的世界裡,您會經常看到許多以 @ 符號開頭的 Annotation (註解)。這些 Annotation 就像是「小貼紙」一樣,標示在程式碼上,幫助 Spring Boot 框架快速了解該怎麼處理程式。

什麼是 Annotation (註解)?

📚 書櫃比喻

想像一下,您正在整理書櫃:

  • 為小說書貼上「小說」標籤
  • 為食譜書貼上「食譜」標籤
  • 為技術書貼上「電腦科學」標籤

這些標籤本身不是書的內容,但它們提供了關於書本的 資訊 (Information),幫助您快速分類。

在 Java 和 Spring Boot 中,Annotation 也是一種「標籤」

  • 它附加在 類別(Class)方法(Method)欄位(Field)
  • 它是一種 元資料 (Metadata)
  • 本身不會直接改變程式邏輯
  • 但能被 編譯器(compiler)Spring Boot 框架 掃描並應用

為什麼 Spring Boot 大量使用 Annotation?

在 Spring Boot 出現之前,開發者要透過大量 XML 設定檔 來告訴 Spring:

  • 哪些類別要交給框架管理 (Beans)
  • Bean 之間如何依賴 (Dependencies)
  • 如何設定 交易(Transaction)安全(Security) 等功能

這種方式繁瑣又容易出錯。

Spring Boot 的核心理念是 約定優於設定 (Convention over Configuration),而 Annotation 正是落實這個理念的工具。

使用 Annotation 的好處:

  1. 簡化設定:設定資訊直接放在程式碼旁邊,取代 XML。
  2. 提高可讀性:看到 @RestController 就知道它是 API 控制器。
  3. 自動化:Spring Boot 會在啟動時自動掃描 Annotation,完成物件建立、依賴注入 (Dependency Injection, DI) 等工作。(DI 指的是由框架自動將你需要的物件準備好,並提供給你的類別使用)

常見的 Annotation 分類

以下是常見的 Spring Boot Annotation,大致可以分成幾類:

  1. 核心元件與組態 (Core Components & Configuration)

    • @Configuration:宣告此類別為一個設定檔,裡面可以包含多個 @Bean 定義。
    • @Bean:標註於方法上,使其回傳的物件交給 Spring 容器管理。
    • @Component:最基礎的元件標註,表示這個類別要被 Spring 掃描並註冊為 Bean。
    • @Service:用於標註商業邏輯層的元件。
    • @Repository:用於標註資料存取層的元件 (通常操作資料庫),具備將底層資料庫錯誤轉譯為 Spring 標準異常的功能。
    • @Controller:用於傳統 MVC 架構的 Web 控制器 (Controller),通常會回傳一個視圖 (View) 名稱。
    • @RestController:用於 RESTful API 的控制器 (Controller),是 @Controller@ResponseBody 的結合,其方法的回傳值會直接轉換為 JSON 或純文字。
  2. 依賴注入 (Dependency Injection)

    • @Autowired:Spring 會自動尋找符合類型的 Bean 並注入。
    • @Qualifier("beanName"):當有多個同類型的 Bean 時,透過名稱指定要注入哪一個。
    • @Value("${property.name}"):從 application.propertiesapplication.yml 檔案中注入設定值。
    • @Lazy:延遲初始化 Bean,直到第一次使用時才建立
  3. Web API 與路由 (Web & Routing)

    • @GetMapping("/path"):處理 HTTP GET 請求。
    • @PostMapping("/path"):處理 HTTP POST 請求。
    • @PutMapping("/path"):處理 HTTP PUT 請求 (通常用於更新)。
    • @DeleteMapping("/path"):處理 HTTP DELETE 請求 (通常用於刪除)。
    • @RequestParam:取得 URL 中的查詢參數 (如: /api/users?name=John)
    • @PathVariable:取得 URL 路徑中的變數 (如: /api/users/123)
    • @RequestBody:取得請求主體 (Request Body) 中的資料 (通常是 JSON 格式)。
  4. 交易管理 (Transaction Management)

    • @Transactional:讓方法 (Method) 或整個類別的公開方法具備交易性。當方法 (Method) 執行成功時,交易會被提交 (Commit);若中途發生錯誤,則會全部回滾 (Rollback)。

程式碼範例

以下是一個最簡單的 Spring Boot API 範例:

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

@RestController  // 告訴 Spring 這是一個 REST API 控制器
public class HelloController {

    @GetMapping("/hello")  // 對應 HTTP GET 請求 /hello
    public String sayHello() {
        return "Hello, Spring Boot!";
    }
}

🔎 說明:

  • @RestController:告訴 Spring 這是一個 API 控制器 (Controller),其方法 (Method) 回傳的結果會自動轉換為 JSON 或純文字。
  • @GetMapping("/hello"):將 sayHello() 方法與 HTTP GET /hello 這個路徑綁定。

Annotation 運作流程 (流程圖)

Spring Boot 處理 Annotation 的簡化流程:

程式碼上標註 Annotation
         ↓
Spring Boot 啟動時掃描所有類別
         ↓
找到 Annotation 並建立對應的 Bean
         ↓
完成依賴注入與自動配置
         ↓
應用程式開始運作

上一篇
Day10 - Spring Boot 依賴注入入門
下一篇
Day12 -Spring Boot 最常見的 Bean - 自動化元件掃描
系列文
spring boot 3 學習筆記16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言